2012-06-10 13 views
16

Używam findHomography na liście punktów i przesyłam wynik do warpPerspective.Wykrywanie homografii śmieci z findHomography w OpenCV?

Problem polega na tym, że czasami wynikiem jest kompletne śmieci, a wynikowy obraz jest reprezentowany przez dziwne szare prostokąty.

Jak mogę wykryć, kiedy findHomography wysyła mi złe wyniki?

Odpowiedz

28

Istnieje kilka testów poprawności, które można wykonać na wyjściu. Na wierzch mojej głowy:

  1. Obliczyć wyznacznik homografii i sprawdzić, czy jest zbyt blisko zera dla wygody.
  2. Jeszcze lepiej, oblicz swoją SVD i sprawdź, czy stosunek pierwszej do ostatniej pojedynczej wartości jest rozsądny (niezbyt wysoki). Wynik wskaże, czy macierz jest zbliżona do liczby pojedynczej .
  3. Obliczyć obrazy narożników obrazu i jego środka (tj. Punktów uzyskanych podczas robienia zdjęć w rogach i na środku) i sprawdzić, czy mają one sens, , tj. Czy znajdują się wewnątrz płótna obrazu (jeśli oczekujesz, że będą)? Czy są od siebie dobrze oddzieleni ?
  4. Wykreśl w matlab/oktawę punkty wyjściowe (dane), w które dopasowałeś homografię do wartości z ich wartościami obliczonymi z wartości wejściowych, używając homografii i sprawdź, czy są one blisko siebie (tzn. Błąd jest niski).

Powszechnym błędem, który prowadzi do wyników śmieci, jest niepoprawna kolejność list punktów wejściowych i wyjściowych, która prowadzi procedurę dopasowywania do pracy przy użyciu niewłaściwych odpowiedników. Sprawdź, czy indeksy są prawidłowe.

+0

+1 dla SVD ..... – Throwback1986

+2

Czy ktoś mógłby wyjaśnić 2.stanie dalej? Jak mogę obliczyć SVD i sprawdzić, czy stosunek pierwszej do ostatniej wartości jednostkowej jest w zgodzie z OpenCV? – Tony

+2

http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html#SVD przekazać NO_UV, ponieważ jesteś zainteresowany tylko wartościami osobliwymi. Następnie współczynnik obliczeniowy (liczba warunków) od pierwszej do ostatniej wartości osobliwej. Zobacz też objaśnienie numeru warunku: http://books.google.com/books?id=1aAOdzK3FegC&pg=PA69&lpg=PA69&dq=numeryczne+warunki+bezpieczeństwa+numer&source=bl&ots=3iSoC8Hoqi&sig=Aq1Yc2MHTpXPI4t8wIhU7h388jg&hl=en&sa=X&ei=hUmKUaqeMemx0QXr -ICAAg & ved = 0CDMQ6AEwAA # v = onepage & q = numeryczne% 20recepty% 20warunki% 20numer & f = false –

0

Ale to zależy od korespondencji punktowej używanej do obliczenia homografii ... Po prostu myśl, że próbujesz znaleźć transformację, która mapuje linie na linie (z jednej płaszczyzny na drugą), więc nie ma żadnej możliwej konfiguracji korespondencji punktowej da ci homografię, która tworzy ładne obrazy. Jest nawet możliwe, że homografia odwzorowuje niektóre punkty w nieskończoność.

+0

Odwzorowywanie punktów do nieskończoności oznacza, że ​​istnieje kilka punktów w nieskończoności, ponieważ funkcja findHomography() minimalizuje właściwe metryki (suma kwadratów różnic współrzędnych). W skrócie, Homografia jest najpierw przybliżana za pomocą algorytmu liniowego (DLT), który minimalizuje błąd w parametrach, który jest mniej optymalny; jego wynik jest wykorzystywany jako domysły dla nieliniowego rozwiązania (algorytm Levenberga-Marquardta), który minimalizuje poprawne metryki - suma kwadratowego współrzędnego. różnice; Jeśli przypuszczenie jest niedokładne, algorytm oddziela się i utknął w lokalnych minimach, co powoduje nieprawidłowe rozwiązanie. – Vlad

3

Zrozumienie zdegenerowanych przypadków homografii jest kluczem. Nie można uzyskać dobrej homografii, jeśli punkty są współliniowe lub bliskie współliniowości, na przykład. Również ogromne szare kwadraty mogą wskazywać na ekstremalne skalowanie. Oba przypadki mogą wynikać z faktu, że w ostatecznej kalkulacji homografii występuje bardzo niewiele wartości lub mapowanie jest nieprawidłowe.

Aby upewnić się, że tak się nie stanie:
1. Upewnij się, że punkty są dobrze rozłożone na obu obrazach.
2. Upewnij się, że istnieje co najmniej 10-30 odpowiedników (4 wystarcza, jeśli hałas jest mały).
3. Upewnij się, że punkty są poprawnie dopasowane, a transformacja jest homografią.

Aby znaleźć złe homografie, zastosuj znalezione H do oryginalnych punktów i zobacz separację od spodziewanych punktów, czyli |x2-H*x1| < Tdist, gdzie Tdist jest progiem błędu odległości. Jeśli jest tylko kilka punktów, które spełniają ten próg, twoja homografia może być zła i prawdopodobnie naruszyłeś jeden z wyżej wymienionych wymagań.