2013-03-18 26 views
5

Tworzę program, który śledzi funkcje z ORB z OpenCV (2.43) Śledziłem this tutorial i użyłem porady from here.FindHV's findHomography daje nonsensowne wyniki

Moim celem jest śledzenie obiektu w materiale wideo (twarz) i narysowanie wokół niego prostokąta.

Mój program znajduje kluczowe punkty i pasuje do nich poprawnie, ale kiedy spróbuję użyć findHomography + perspectiveTransform, aby znaleźć nowe rogi obrazu, zwykle zwraca niektóre wartości typu nonsens (choć czasami zwraca prawidłową homografię).

Oto przykład obrazku: example

Oto odpowiadające problematyczna część:

Mat H = findHomography(obj, scene, CV_RANSAC); 

//-- Get the corners from the image_1 (the object to be "detected") 
std::vector<Point2f> obj_corners(4); 
obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint(img_object.cols, 0); 
obj_corners[2] = cvPoint(img_object.cols, img_object.rows); obj_corners[3] = cvPoint(0, img_object.rows); 
std::vector<Point2f> scene_corners(4); 

perspectiveTransform(obj_corners, scene_corners, H); 

//-- Draw lines between the corners (the mapped object in the scene - image_2) 
line(img_matches, scene_corners[0] + Point2f(img_object.cols, 0), scene_corners[1] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 
line(img_matches, scene_corners[1] + Point2f(img_object.cols, 0), scene_corners[2] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 
line(img_matches, scene_corners[2] + Point2f(img_object.cols, 0), scene_corners[3] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 
line(img_matches, scene_corners[3] + Point2f(img_object.cols, 0), scene_corners[0] + Point2f(img_object.cols, 0), Scalar(0, 255, 0), 4); 

Reszta kodu jest praktycznie taka sama jak w linkach ja usług. Wykreślone linie wydają się kompletnie losowe, moim celem jest uzyskanie minimalnego prostokąta obiektu źródłowego w nowej scenie, więc jeśli istnieje alternatywa dla używania homografii, która również działa.

P.S. Obraz źródłowy do śledzenia to region skopiowany z wejścia wideo, a następnie śledzony w nowych obrazach z tego wejścia, czy ma to znaczenie?

+0

Podanie dodatkowych informacji, np. obrazy z wynikami byłyby użyteczne. –

+0

cóż, to jest coś jak tutaj: http://dl.dropbox.com/u/5481096/Clipboard02.jpg. – user2184001

+0

Edytowałem obraz na twoje pytanie. Jeśli chcesz podać więcej informacji w przyszłości, najlepiej edytuj swoje pytanie, aby łatwiej było je zobaczyć. –

Odpowiedz

0

Funkcja szacuje homografię przy założeniu, że odpowiadający zestaw punktów nie jest podatny na błędy. Jednak w danych rzeczywistych nie można tego zakładać. Rozwiązaniem jest użycie solidnej funkcji estymacji, takiej jak RANSAC, aby rozwiązać problem homografii jako nadrzędny układ równań.

Zamiast tego można użyć funkcji , która zwraca homografię. Wejście tej funkcji jest zbiorem punktów. Ten zestaw wymaga co najmniej 4 punktów, ale większy zestaw jest lepszy. Homografia jest tylko oszacowaniem, ale jest bardziej odporna na błędy. Używając flagi jest ona w stanie usuwać wartości wewnętrzne (niewłaściwe korespondencje punktowe).

Powiązane problemy