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?

Martin Beckett
źródło

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.

Dipan Mehta
źródło
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

endolit
źródło
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ń.

aagaard
źródło
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.

meanderix
źródło
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