/ / Ocena pozycji głowy za pomocą 2 kamer - opengl, opencv, wizja komputerowa, kalibracja kamery, ocena pozycji

Szacowanie pozycji głowy za pomocą 2 kamer - opengl, opencv, wizja komputerowa, kalibracja kamery, oszacowanie pozy

Pracuję nad projektem oceny ułożenia głowyza pomocą 2 kamer. Dla jednego systemu kamer działa i zwraca macierz obrotu i wektor translacji głowy w odniesieniu do każdego układu współrzędnych kamery. Renderowałem obiekt w scenie OpenGL, który jest obracany i tłumaczony, aby reprezentować ruchy głowy. Aby wyświetlić obliczoną macierz obrotu i wektor translacji, po prostu używam następujących poleceń OpenGL.

glMatrixMode(GL_MODELVIEW);
glLoadMatrixd(pose_matrix);

gdzie macierzą pozy jest macierz OpenGL ModelView zbudowana z macierzy obrotu i wektora translacji głowy.

Teraz próbuję to zrobić dla 2 skalibrowanychaparaty fotograficzne. Kiedy pierwsza kamera straciła ślad twarzy, ale druga ocenia pozycję głowy, wyświetlam obrót i translację w odniesieniu do drugiej i odwrotnie. Chcę wyświetlić jeden obiekt OpenGl i przenieść go w obu przypadkach. W tym celu muszę przenieść macierze pozy do wspólnej ramki współrzędnych.

Znam względną geometrię 2 kamerszanować się nawzajem. Zakładam, że jedna z kamer jest światową ramką współrzędnych i przenoszę macierz pozy drugiej kamery na ramkę pierwszej kamery, mnożąc macierz pozy i matrycę kalibracji drugiej kamery względem pierwszej kamery. Kiedy ładuję tę zwielokrotnioną macierz do macierzy OpenGL ModelView, otrzymuję błędne wyniki. Gdy pierwsza kamera zarejestruje twarz, obiekt porusza się w prawo, ale w przypadku drugiej kamery obiekt jest przesuwany i obracany i nie znajduje się w tym samym miejscu, co w przypadku pierwszej kamery.

Co może być problemem? Może część wyświetlająca OpenGL jest nieprawidłowa lub?

Odpowiedzi:

0 dla odpowiedzi № 1

Bezpieczne domyślne założenie: OpenGL ma rację, kod jest niepoprawny.

Nie widząc twojego kodu, mogę zaproponować wydrukowanie twoich macierzy i dwukrotne sprawdzenie matematyki w Matlabie lub Oktawie.

Częstym błędem jest zapominanie o tym domyślnieOpenGL PRE-zwielokrotnia wektory ROW przez macierz modelvie (faktycznie wszystkie macierze). Oznacza to, że mnoży się jako v_row * M, a macierz przechowywana jest w porządku col-dur, podczas gdy możesz myśleć w ramach wspólnej matematycznej konwencji traktowania wektorów jako COLUMN i POST-mnożenie ich jako M * v_col (z M zapisanymi rząd główny).

Jeśli wolisz pracować z tą ostatnią konwencją (zalecane), sprawdź GL_ARB_transpose_matrix rozbudowa.