Matryca projekcyjna 3D do 2D
Mam 3 punkty w przestrzeni 3D, z których znam dokładne lokalizacje. Załóżmy, że są: (x0,y0,z0)
, (x1,y1,z1)
i (x2,y2,z2)
.
(x0,y0,z0)
będzie (x0',y0')
, A (x1,y1,z1)
będzie (x1',y1')
i (x2,y2,z2)
będzie (x2',y2')
z punktu widzenia kamery.
Jaki jest najprostszy sposób na znalezienie matrycy projekcyjnej, która wyświetli te punkty 3D w punkty 2D na kamerze / align = "left" / Nic nie wiemy o lokalizacji kamery.
4 answers
To daje dwa zbiory, każdy z trzech równań w 3 zmiennych:
a*x0+b*y0+c*z0 = x0'
a*x1+b*y1+c*z1 = x1'
a*x2+b*y2+c*z2 = x2'
d*x0+e*y0+f*z0 = y0'
d*x1+e*y1+f*z1 = y1'
d*x2+e*y2+f*z2 = y2'
Po prostu użyj tej, która metoda rozwiązywania równań symultanicznych jest najłatwiejsza w twojej sytuacji (nie jest nawet trudno rozwiązać je "ręcznie"). Wtedy macierz transformacji jest po prostu ((a,b,c)(d, e, f)).
...
Właściwie, to jest zbyt uproszczone i zakłada kamerę skierowaną na początek układu współrzędnych 3D i brak perspektywy.
Dla perspektywy, macierz transformacji działa więcej jak:
( a, b, c, d ) ( xt )
( x, y, z, 1 ) ( e, f, g, h ) = ( yt )
( i, j, k, l ) ( zt )
( xv, yv ) = ( xc+s*xt/zt, yc+s*yt/zt ) if md < zt;
Ale macierz 4x3 jest bardziej ograniczona niż 12 stopni swobody, ponieważ powinniśmy mieć
a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1
Więc prawdopodobnie powinieneś mieć 4 punkty, aby uzyskać 8 równań obejmujących 6 zmiennych dla pozycji i kąta kamery i 1 więcej dla skalowania punktów widzenia 2-D, ponieważ będziemy w stanie wyeliminować współrzędne "center" (xc,yc).
Więc jeśli masz 4 punkty i przekształć swoje punkty widoku 2-D, aby były względem środka wyświetlacza, możesz uzyskać 14 jednoczesne równania w 13 zmiennych i rozwiązać.
Niestety, sześć równań nie jest równaniami liniowymi. Na szczęście, wszystkie zmienne w tych równaniach są ograniczone do wartości między -1 i 1, więc nadal jest prawdopodobnie możliwe do rozwiązania równań.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-25 02:58:32
Aparat ma (co najmniej) 7 stopni swobody - 3 dla pozycji, 3 dla orientacji i 1 dla pola widzenia. Jestem pewien, że ktoś mnie poprawi, jeśli się mylę, ale wydaje się, że 3 punkty nie wystarczą do pełnego rozwiązania.
Aby znaleźć ogólne rozwiązanie tego problemu, poszukaj "View Correlation" w Graphics Gems II.
To, czego szukasz, nazywa się algorytmem estymacji pozy. Zapraszamy do zapoznania się z implementacją POSIT w OpenCV: http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html#posit
Będziesz potrzebował czterech lub więcej punktów i mogą nie leżeć w tej samej płaszczyźnie.
Tutorial do tej implementacji znajduje się tutaj: http://opencv.willowgarage.com/wiki/Posit
Uważaj jednak: w samouczku kwadratowy widok jest używany, więc wszystkie współrzędne widoku są w zakresie od -1,-1 do 1,1. Prowadzi to do założenia, że powinny one znajdować się w układzie współrzędnych kamery (przed korektą proporcji). Tak nie jest, więc jeśli używasz viewport z np. proporcjami obrazu 4: 3, twoje współrzędne wejściowe powinny być w zakresie od -1.3333, -1 do 1.3333, 1.
Nawiasem mówiąc, jeśli twoje punkty muszą leżeć w tej samej płaszczyźnie, możesz również spojrzeć na algorytm CameraCalibration z OpenCV, ale to jest bardziej zaangażowany w konfigurację i wymaga więcej punktów jako danych wejściowych. Jednak zapewni to również informacje o zniekształceniach i wewnętrznych parametrach kamery.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-14 09:35:35
Myślę, że nie ma wystarczająco dużo informacji, aby znaleźć ostateczne rozwiązanie. Nie znając lokalizacji kamery i nie znając płaszczyzny widzenia, istnieje nieskończona liczba matryc, które mogą rozwiązać ten problem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-25 01:08:34