2013-09-26 13 views
9

Użyłem API OpenCV cv::findHomography do kaculacji macierzy homograficznej dwóch płaskich obrazów. Dopasowane kluczowe punkty są wyodrębniane przez SIFT i dopasowywane przez BFMatcher. Jak wiem, cv:findHomography używają iteracji RANSAC do znalezienia najlepszych czterech odpowiadających punktów, aby uzyskać matrycę do homografii. Tak więc rysuję wybrane cztery pary punktów za pomocą obliczonego konturu przy użyciu macierzy homograhy krawędzi obiektu. Rezultatem są jako linki:jak poprawić dokładność homografii?

http://postimg.org/image/5igwvfrx9/

Jak widzimy, wybrany dopasowane punkty RANSAC są poprawne, ale pokazuje, że kontur homography nie jest dokładna.

Ale to badanie pokazuje, że zarówno wybrany dopasowane punkty i homography są poprawne:

http://postimg.org/image/dvjnvtm53/

Domyślam się, że jeśli wybrany dopasowane punkty są zbyt blisko, mały błąd położenia piksela doprowadzi do znaczącego błędu macierzy homografii. Jeśli cztery punkty znajdują się w rogu obrazu, przesunięcie dopasowanych punktów o 4-6 pikseli nadal ma dobrą matrycę do homografii. (zgodnie współrzędne jednorodne, myślę, że jest to uzasadnione, ponieważ mały błąd w najbliższym samolotem będą wzmacniane w daleko)

Moje pytanie brzmi:

1.Czy moje prawo domysły? 2. Ponieważ cztery dopasowane punkty są generowane przez iterację RANSAC, ogólny błąd wszystkich punktów końcowych jest minimalny. Ale jak uzyskać stabilną homografię, przynajmniej sprawić, aby mapowanie konturu było prawidłowe? Teoria udowodniła, że ​​jeśli znaleziono cztery odpowiadające punkty w płaszczyźnie, należy obliczyć macierz homograficzną, ale czy istnieje jakakolwiek sztuczka w pracy inżyniera?

Dziękuję.

+0

znalazłeś jakieś rozwiązanie lub jakieś wyjaśnienie? Mam ten sam problem – MMH

Odpowiedz

5

Myślę, że masz rację, a bliskość 4 punktów nie pomaga w dokładności wyniku. To, co obserwujesz, może być wywołane przez problemy numeryczne: wynik może być lokalnie poprawny dla tych 4 punktów, ale staje się gorszy, gdy idziesz dalej.

Jednak RANSAC nie pomoże tutaj. Powód jest prosty: RANSAC to solidna procedura estymacji, która została zaprojektowana, aby znaleźć najlepsze pary punktów spośród wielu odpowiedników (w tym niektóre błędne). Następnie, w wewnętrznej pętli RANSAC, wykonywane jest standardowe oszacowanie homografii.

Widać RANSAC jako sposób odrzucenia odpowiedniki niewłaściwy punkt że sprowokuje zły wynik.

Powrót do Twojego problemu:

Co naprawdę potrzebne jest, aby mieć więcej punktów. W twoich przykładach używasz tylko 4-punktowych odpowiedników, które są wystarczające do oszacowania homografii. Poprawisz swój wynik, zapewniając więcej dopasowań na całym obrazie docelowym. Problem staje się zbyt duży, ale OpenCV może znaleźć rozwiązanie najmniejszych kwadratów.Ponadto, istnieje pewien błąd albo w procesie korespondencji punktowej, albo w pewnym punkcie lokalizacji, RANSAC będzie w stanie wybrać najlepsze i nadal zapewnia wiarygodny wynik.

Jeśli wyniki RANSAC spowodują przeurzenie na jakieś 4 punkty (co wydaje się mieć miejsce w twoim przykładzie), spróbuj złagodzić ograniczenie, zwiększając parametr ransacReprojThreshold. Alternatywnie można:

  • użycie inny estymator (solidna mediana CV_LMEDS jest dobrym wyborem, jeśli istnieje kilka błędów dopasowania)
  • lub użyj RANSAC w pierwszym etapie z dużym błędem ponowne odwzorowanie (do uzyskać przybliżoną ocenę) w celu wykrycia fałszywych powiązań, a następnie użyć LMEDS na prawidłowych.
+0

dzięki za twoją opinię. Być może nie opisałem tego wystarczająco jasno.W rzeczywistości dostarczyłem około setek dopasowanych punktów do cvFindHomography. Mam dig do kodu źródłowego ransac w opencv, cztery punkty, które rysowałem to to, co proces ransac "uważa" za najlepsze wyniki. (Jest to rodzaj iteracji i za każdym razem zbiera cztery pary punktów) niestety, nie zawsze tak jest Wydajność do dobrej matrycy do homografii, chociaż pary punktów wydają się pasować do ludzkich oczu. – binzhang

+1

Mój eksperyment pokazuje: jeśli dostarczone dopasowane punkty kluczowe są rozmieszczone w środku prostokąta. Następnie, jeśli użyję cakulowanej homografii do przekształcenia punktów narożnych prostokąta, błąd jest duży przy niewielkim przesunięciu pozycji punktów kluczowych. Jeśli pozycja odebranych dopasowanych punktów kluczowych zostanie rozdzielona między każdy z czterech rogów prostokąta. Następnie jeśli użyję homografii do przekształcenia punktów wewnątrz prostokąta, wynik jest poprawny. Więc moim problemem jest to, że jeśli mogę uzyskać tylko dopasowane kluczowe punkty w pobliżu środka prostokąta, w jaki sposób mogę poprawić wydajność? – binzhang

+0

To jest oczywiste. Dopasowania środkowe spowodują znacznie większy błąd. Spróbuj zdobyć jakieś mecze na rogu. Ulepsz swoich kluczowych kandydatów. – SolessChong

3

Wystarczy przedłużyć odpowiedź @ Sansuiso'S, z którym się zgadzam:

Jeśli podasz około 100 korespondencje do RANSAC, prawdopodobnie otrzymujesz więcej niż 4 inliers z cvFindHomography. Sprawdź parametr wyjściowy status. Aby uzyskać dobrą homografię, powinieneś mieć wiele więcej niż 4 odpowiedniki (pamiętaj, że 4 odpowiedniki zawsze dają homografię), które są dobrze rozmieszczone wokół obrazu i które nie są liniowe. W rzeczywistości możesz użyć minimalnej liczby zmiennych, aby zdecydować, czy otrzymana homografia jest wystarczająco dobra.

Należy zauważyć, że RANSAC znajduje zestaw punktów, które są spójne, ale sposób, w jaki musi powiedzieć, że ten zestaw jest najlepszy (błąd reprojection) jest nieco ograniczony. Istnieje metoda podobna do RANSAC, zwana MSAC, która używa nieco innego pomiaru błędu, sprawdź to.

Zła wiadomość, z mojego doświadczenia wynika, że ​​mało prawdopodobne jest uzyskanie w 100% dokładnej homografii przez większość czasu. Jeśli masz kilka podobnych ramek, możliwe, że widzisz, że homografia zmienia się trochę między nimi.

Istnieją sztuczki, aby to poprawić. Na przykład, po uzyskaniu homografii z RANSAC, możesz użyć jej do projekcji swojego modelu w obrazie i szukać nowych odpowiedników, abyś mógł znaleźć inną homografię, która powinna być dokładniejsza.

0

Twój cel ma wiele elementów symetrycznych i podobnych. Jak wspomnieli inni (i wyjaśniłeś to później), punktowy odstęp i numer punktu mogą być problemem. Innym problemem jest to, że SIFT nie jest zaprojektowany do radzenia sobie z poważnymi zniekształceniami perspektywy, które są obecne w twoim przypadku. Postaraj się śledzić obiekt za pomocą mniejszych obrotów i jak wspomniano, przeprowadź je przy użyciu najnowszej homografii, aby wyglądało jak najbliżej oryginału. Umożliwi to również pominięcie przetwarzania ciężkiego SIFT i użycie czegoś tak lekkiego jak FAST z korelacją krzyżową łatek obrazu do dopasowania.

Możesz także w końcu dojść do wniosku, że używanie punktów nie jest wystarczające. Musisz użyć wszystkiego, co masz, a to oznacza linie lub koniczynki. Jeśli homografia przekształca punkt Pb = H * Pa, łatwo jest zweryfikować, że w homogenicznej linii współrzędnych Lb = Henv.transposed * La wynika to bezpośrednio z równania La'.Pa = 0 = La '* Hinv * H * Pa = La '* Hinv * Pb = Lb'.Pb Możliwe min. konfiguracje to 1 linia i trzy punkty lub trzy linie i jeden punkt. Dwie linie i dwa punkty nie działają. Możesz także użyć czterech linii lub czterech punktów. Oczywiście oznacza to, że nie możesz już używać funkcji openCV i musisz napisać własną DLT, a następnie nieliniową optymalizację.