2012-10-19 9 views
9

Mam skalibrowany aparat z OpenCV (findChessboard etc) tak mam: - Camera Distortion Współczynniki & intrinsics matryca - Kamera Pose informacje (Tłumaczenie & Obrót, obliczony separatedly innymi metodami), jak Euler Angles & a 4x4 - Punkty 2D w ramce kameryW OpenCV, konwersja 2D punkt obrazu do jednostki 3d świata wektora

Jak mogę przekonwertować te punkty 2D na trójwymiarowe wektory jednostek wskazujące na świat? Próbowałem użyć cv :: undistortPoints, ale nie wydaje się, aby to zrobić (zwraca tylko punkty remapowane w 2D), i nie jestem do końca pewien, jakiej metody matematycznej matematyki użyć do modelowania kamery za pomocą posiadanej przez mnie samej Kamery.

+0

O jakich punktach 2D mówisz? –

+0

Współrzędne obrazu 2D (piksel) zarejestrowane w ramce kamery. Zasadniczo, biorąc pod uwagę współrzędne obrazu 2D i powyższe dane, powinienem móc skonstruować wektor jednostki 3D wskazujący na tę współrzędną obrazu 2D z Kamery. – Yeraze

Odpowiedz

14

Konwersja punktu 2d w punkt homogeniczny (trzecia współrzędna jest równa 1), a następnie pomnóż przez odwrotność macierzy wewnętrznej kamery. Na przykład:

cv::Matx31f hom_pt(point_in_image.x, point_in_image.y, 1); 
hom_pt = camera_intrinsics_mat.inv()*hom_pt; //put in world coordinates 

cv::Point3f origin(0,0,0); 
cv::Point3f direction(hom_pt(0),hom_pt(1),hom_pt(2)); 

//To get a unit vector, direction just needs to be normalized 
direction *= 1/cv::norm(direction); 

początek i kierunek określają teraz promień w przestrzeni świata odpowiadający temu punktowi obrazu. Zauważ, że tutaj pochodzenie jest wyśrodkowane na kamerze, możesz użyć pozy kamery, by przekształcić się w inne pochodzenie. Współczynniki zniekształceń są odwzorowywane od rzeczywistej kamery do modelu kamery otworkowej i powinny być używane na samym początku, aby znaleźć aktualną współrzędną 2d. Etapy są więc

  1. Undistort 2d koordynować współczynniki zniekształceń
  2. Konwersja do promienia (jak przedstawiono powyżej)
  3. przeniesienie tego promienia do dowolnego systemu chcesz współrzędnych.
+0

Zapomniałeś normalizować hom_pt. :) –

+0

@IanMedeiros czy chcesz zrobić z niego wektor jednostkowy, czy też stworzyć trzeci element 1? Wektor zdefiniowany przez te punkty jest poprawny z normalizacją lub bez niej, po pomnożeniu przez odwrotność matrycy kamery trzeci element można zinterpretować jako współrzędną z. – Hammer

+0

Właściwie to przegłosowałem twoją odpowiedź, ale teraz nie jestem pewien, czy jest ona poprawna. Myślę, że musisz przekonwertować współrzędne 2D z pikseli na współrzędne świata, używając macierzy własnej przed wykonaniem homogenizacji, o której mówisz. Następnie można go przekształcić, korzystając z informacji o ułożeniu kamery, aby uzyskać kierunek promienia. –

Powiązane problemy