2012-10-19 9 views
9

ho calibrato la mia macchina fotografica con OpenCV (findChessboard, ecc) in modo da avere: - Camera Distorsione Coefficienti & Intrinsics matrice - Camera Pose informazioni (Traduzione & rotazione, calcolata separatedly tramite altri mezzi) come Eulero Angoli & a 4x4 - Punti 2D all'interno della cornice della telecameraIn OpenCV, la conversione punto dell'immagine 2d all'unità mondo 3D vettoriale

Come posso convertire questi punti 2D in vettori di unità 3D che indicano nel mondo? Ho provato ad utilizzare cv :: undistortPoints ma che non sembra farlo (restituisce solo 2D rimappata punti), e io non sono esattamente sicuro quale metodo di matrice matematica da utilizzare per modellare la fotocamera tramite i intrinseci della macchina fotografica che ho.

+0

Quali punti 2D stai parlando? –

+0

Coordinate dell'immagine 2D (pixel) catturate all'interno della cornice della telecamera. Essenzialmente, data una coordinata dell'immagine 2D e i dati di cui sopra, dovrei essere in grado di costruire un vettore di unità 3D che punta a quella coordinata di immagine 2D dalla fotocamera. – Yeraze

risposta

14

Converti il ​​punto 2d in un punto omogenea (invia una terza coordinata uguale a 1) e poi moltiplicare per l'inverso della matrice intrinseche della fotocamera. Ad esempio

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

origine e la direzione ora definire il raggio nello spazio globale corrispondente a quel punto dell'immagine. Notare che qui l'origine è centrata sulla fotocamera, è possibile utilizzare la posa della fotocamera per trasformarla in un'origine diversa. I coefficienti di distorsione vengono mappati dalla tua fotocamera reale al modello di fotocamera pinhole e dovrebbero essere utilizzati all'inizio per trovare la tua coordinata 2D attuale. I passi sono poi

  1. Undistort 2d coordinare con una distorsione coefficienti
  2. Converti in raggi (come indicato sopra)
  3. Sposta quel raggio a qualsiasi sistema di coordinate che ti piace.
+0

Hai dimenticato di normalizzare hom_pt. :) –

+0

@IanMedeiros intendi renderlo un vettore unitario o creare il terzo elemento 1? Il vettore definito dai punti è corretto con o senza alcun tipo di normalizzazione, dopo moltiplicando per l'inverso della matrice telecamera 3 ° elemento può essere interpretato come una coordinata z. – Hammer

+0

In realtà, ho svalutato la tua risposta ma ora non sono sicuro se è corretta. Penso che sia necessario convertire le coordinate 2D dai pixel alle coordinate del mondo usando la matrice intrinseca prima di fare l'omogeneizzazione di cui si sta parlando. Di quanto tu possa trasformarlo usando le informazioni sulla posa della camera per ottenere la direzione del raggio. –

Problemi correlati