Szybki przybliżony przepływ optyczny / przesunięcie obrazu


9

Muszę wykryć szybkość przesuwania kamery (poziomo / pionowo), aby ostrzec operatora, aby zwolnił.

Cały obraz porusza się jak blok, nie potrzebuję rzeczywistego kierunku (chociaż H lub V byłyby bonusem) i potrzebuję tylko przybliżonej wielkości - tj. wyzwalane, jeśli między klatkami przesuwa się więcej niż „N” pikseli.

Obrazy są duże i ogólnie jednolite sceny o niskim kontraście, nie mam żadnych oczywistych wyróżnień do śledzenia. Muszę to zrobić w czasie rzeczywistym (60 klatek na sekundę) i bez użycia całego procesora.

Rozwiązaniem Niave jest wybranie wskaźnika ROI na środku, znalezienie krawędzi, obliczenie podobieństwa między parami ramek, przesunięcie jednej z klatek w lewo / prawo / w górę / w dół o piksel, powtórzenie - znalezienie minimów.

Zastanawiałem się, czy istnieje mądrzejsze rozwiązanie?

Odpowiedzi:


3

Prawdopodobnie, jeśli szukasz prostej metody, to zastosować standardowe algorytmy oceny ruchu, które są bardzo dojrzałe w klasie kodeków kompresji MPEG. Są łatwe do zrozumienia i myślę, że dostaniesz wiele gotowych do użycia kodów. Ten algorytm wytwarza wektor ruchu na zasadzie blok po bloku, a następnie można znaleźć najbardziej znaczącą grupę i przyjąć średni kierunek i wielkość wektora ruchu.

MPEG4 - ma inną kluczową koncepcję zwaną „ Globalną kompensacją ruchu ”, techniką, która próbuje najpierw oszacować i skompensować ruch kamery i panoramowanie. Piękno polega na tym, że takie metody mogą być prostsze lub wyczerpujące w zależności od złożoności. Oto jeden przykładowy papier i inny papier do tego samego.

Ogólnie rzecz biorąc, przesuwanie kamery i szacowanie ruchu to dość ugruntowana dziedzina badań. tutaj jest odniesienie: papier i inny papier .

W tym temacie. Znajdziesz zarówno algorytm rygorystyczny i dokładny, jak i prosty i szybki.


Jeśli mogę wygodnie podłączyć się do biblioteki MPEG, która byłaby dobra, pamiętam, że GMC w Mpeg było krytykowane. Myślałem, że będzie to wspólny obszar ze względu na algorytmy stabilizacji kamery
— Martin Beckett

Na pewno możesz podpiąć (a raczej wyodrębnić) algorytmy MPEG. Możesz użyć FFMPEG jako biblioteki i wyodrębnić to - ale może to być trudne. Alternatywnie możesz przeczytać czysty kod MSSG, aby go wyodrębnić.
— Dipan Mehta

Jeśli chodzi o krytykę GMC - to więcej niż obiecuje się radykalnie zmniejszyć szybkość transmisji i stworzyć kodowanie obiektowe . Jednak oszacowanie parametrów ruchu kamery nie jest tak trudne.
— Dipan Mehta

dzięki, spojrzę na MSSG. Używam ffmpeg, ale nie jest to łatwa biblioteka do wyciągnięcia rzeczy!
— Martin Beckett

3

To może być powolne, straszne rozwiązanie, ale możesz wykonać korelację krzyżową kolejnych ramek opartą na FFT, a następnie znaleźć wartość szczytową w celu zidentyfikowania przesunięcia między ramkami. Być może zrób to tylko na małym podzbiorze obrazu, aby zaoszczędzić cykle procesora.

Nie działałoby to z rotacją lub drastycznymi zmianami sceny z jednej klatki do drugiej, i prawdopodobnie są lepsze metody. Jest to rodzaj rozwiązania „Mam młotek, więc wszystko wygląda jak gwóźdź”. Wydaje mi się, że jest to tak samo jak naiwne rozwiązanie, z tym wyjątkiem, że nie ma potrzeby wykrywania krawędzi, a FFT sprawia, że ​​jest to znacznie szybsze niż jawne przesuwanie jednego piksela na raz.

To pytanie jest podobne i nikt nie sugeruje niczego poza korelacją krzyżową, więc może nie jest tak źle: Używanie MATLAB do obliczania przesunięcia między kolejnymi obrazami


Dzięki, łatwo założyć, że FFT działa wolno, ale mogę zrobić małe okno 2 ^ n. ps. Tylko do wyszukiwania stackoverflow.com/questions/1100100/…
— Martin Beckett

3

Jednym ze sposobów oszacowania prędkości i kierunku byłoby dokonanie „lokalnego” oszacowania przepływu np. Czterech okien w środku obrazu. Metoda różnicowa Lucas – Kanade zakłada, że ​​przemieszczenie jest w przybliżeniu stałe i dlatego możliwe jest rozwiązanie jako równanie.

Więc mój przewodnik krok po kroku będzie:

  1. Uzyskaj okno pikseli na środku obrazu, np. 20 x 20
  2. Oblicz gradienty Ix i Iy.
  3. Podziel okno gradientu na cztery części, np. 4x10x10.
  4. Rozwiąż cztery liniowe równania najmniejszych kwadratów z następną ramką.
  5. Uśrednij cztery wektory prędkości.

Określa kierunek i prędkość, jednak można użyć ważonego okna, aby uczynić je bardziej solidnym. Spójrz na metodę Lucas-Kanade dla jej rozszerzeń.


0

Myślę, że korelacja krzyżowa jest dobrym podejściem do znalezienia przesunięcia, ale jeśli chcesz to zrobić naprawdę szybko, możesz spróbować ograniczyć go tylko do jednej pionowej i jednej poziomej linii skanowania (tj. Przez środek obrazu). Obliczenie korelacji krzyżowej między liniami skanowania w obu ramkach powinno dać przybliżenie przesunięcia poziomego i pionowego.


Może to działać, ale jeśli przesuwa się po przekątnej, nie działa dobrze, nawet jeśli jest to tylko niewielki wstrząs w górę iw dół podczas przesuwania w bok. Myślę, że lepszy byłby prostokątny podregion w środku obrazu.
— endolith
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.