2008-09-25 28 views
16

Mam 3 punkty w przestrzeni 3D, z których wiem dokładnych lokalizacji. Załóżmy, że są to: (x0,y0,z0), (x1,y1,z1) i (x2,y2,z2).3D do 2d matrycy projekcyjnej

Mam również aparat, który patrzy na te 3 punkty i znam położenie 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 najłatwiejszy sposób znalezienia macierzy projekcji, która wyświetli te punkty 3D w punktach 2D na płaszczyźnie widoku kamery. Nie wiemy nic o położeniu kamery.

+0

To nie jest moja praca domowa! –

Odpowiedz

12

Daje to dwa zestawy, 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' 

Wystarczy użyć dowolnej metody rozwiązywania równań jest najłatwiejszy w danej sytuacji (nie jest nawet trudno rozwiązać te „przez dłoń"). Wtedy macierz transformacji jest po prostu ((a, b, c) (d, e, f)).

...

Właściwie, to jest zbyt uproszczony i zakłada aparat wskazał na swojego pochodzenia 3D system i nie perspektywę współrzędnych.

Do widzenia, macierz transformacji działa bardziej 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 ograniczone 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 powinieneś mieć 4 wskazuje na 8 równań, które obejmują 6 zmiennych dla pozycji i kąta kamery oraz 1 więcej dla skalowania punktów widokowych 2D, ponieważ będziemy w stanie wyeliminować współrzędne "centrum" (xc, yc).

Więc jeśli masz 4 punkty i przekształcasz swoje punkty widzenia 2D w stosunku do środka ekranu, możesz uzyskać 14 równoczesnych równań w 13 zmiennych i rozwiązać.

Niestety, sześć równań nie ma równań liniowych. Na szczęście wszystkie zmienne w tych równaniach są ograniczone do wartości od -1 do 1, więc nadal możliwe jest rozwiązanie równań.

+0

Twoje rozwiązanie było prawdopodobnie najlepszą odpowiedzią, jaką znalazłem w moim problemie. Opisz nieco więcej na temat drugiej części rozwiązania. co to jest xv i yv również md i zt i xt yt zt. Wielkie dzięki –

0

Nie sądzę, że jest wystarczająco dużo informacji, aby znaleźć ostateczne rozwiązanie. Nie znając swojej lokalizacji kamery i nie znając swojej płaszczyzny widoku, istnieje nieskończona liczba macierzy, które mogą rozwiązać ten problem.

+0

Nie, on ma na myśli, że istnieje nieskończona liczba matryc, które robią to, o co prosisz za dany zestaw punktów. Potrzebujesz albo więcej punktów, albo mniej swobody (np. Napraw FOV kamery), aby to naprawić. –

+0

ile punktów potrzebuję? –

+1

Jeśli znasz płaszczyznę widzenia kamery (odległość Z od kamery), używając punktów, możesz określić pozycję kamery, ponieważ jest to przecięcie tylko trzech linii. Stamtąd myślę, że osie macierzy mogą być możliwe do obliczenia. –

3

Aparat ma (co najmniej) 7 stopni swobody - 3 dla pozycji, 3 dla orientacji i 1 dla FOV. Jestem pewien, że ktoś mnie poprawi, jeśli się mylę, ale nie wydaje mi się, żeby 3 punkty wystarczały na pełne rozwiązanie.

Aby uzyskać ogólne rozwiązanie tego problemu, poszukaj w polu Graphics Gems II "Zobacz korelację".

+0

7 jest zwykle poprawny, chociaż niektóre systemy dopuszczają dwa parametry dla FOV: pionowe i poziome. Zwykle są one proporcjonalne do siebie nawzajem (to jest współczynnik 4: 3 = stosunek FOV 4: 3), ale w niektórych przypadkach może to być przekrzywienie, jeśli użytkownik sobie tego życzy. –

2

To, czego szukasz, to algorytm określania pozy. Rzuć okiem na 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 nie mogą leżeć w tej samej płaszczyźnie.

Tutorial dla tej implementacji jest tutaj: http://opencv.willowgarage.com/wiki/Posit

dbać choć: w ćwiczeniu używana jest kwadrat rzutnia, więc wszystko Widok współrzędne są w -1, -1 do 1,1 przedziale . Prowadzi to do założenia, że ​​powinny one znajdować się w układzie współrzędnych kamery (przed korektą współczynnika proporcji). Tak nie jest, więc jeśli używasz widoku z np. Współczynnik kształtu 4: 3 to współrzędne wejściowe powinny być w zakresie od -1.3333, od -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 Camera Calibration z OpenCV, ale jest to bardziej związane z konfiguracją i wymaga więcej punktów jako danych wejściowych. Jednakże dostarczy również informacji o zniekształceniach i parametrach wewnętrznych kamery.