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).

Mam też kamerę, która patrzy na te 3 punkty i znam lokalizacje 2D tych trzech punktów na płaszczyźnie widoku kamery. Na przykład (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.

Author: Laurent, 2008-09-25

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ń.
 12
Author: tye,
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.

 3
Author: ,
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:13:25

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.

 2
Author: Lex van der Sluijs,
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.

 0
Author: Jim Buck,
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