2014-12-09 25 views
5

Sto facendo un progetto in opencv per rilevare l'ostacolo nel percorso di un utente non vedente utilizzando la calibrazione stereo. Ho calcolato correttamente la mappa delle disparità. Ora per trovare la distanza dell'ostacolo dalla telecamera, voglio che le sue coordinate 3D [X, Y, Z], che sto cercando di indovinare possano essere trovate da reprojectImageTo3D(), ma non ho la matrice Q da usare in questa funzione perché La matrice Q che sto ricevendo da stereoRectify() sta arrivando a zero probabilmente perché ho usato immagini pre calibrate. Anche se ho i parametri intrinseci ed estrinseci della mia macchina fotografica. Quindi la mia domanda è: come posso creare manualmente la matrice Q da utilizzare direttamente nella funzione reprojectImageTo3D(), se conosco la lunghezza focale, la linea di base e qualsiasi altra cosa sulla mia fotocamera? Qual è il formato di base della matrice Q?Matrice Q per la funzione reprojectImageTo3D in opencv

risposta

9

La forma della matrice Q è data come segue:

Q Matrix Image

In quell'immagine, c x e c y sono le coordinate del punto principale nella fotocamera sinistra (se hai eseguito lo stereo con la dominante della fotocamera sinistra), c ' x è la coordinata x del punto principale nella parte destra c amera (c x e c' x sarà lo stesso se specificato il flag CV_CALIB_ZERO_DISPARITY per stereoRectify()), f è la lunghezza focale e T x è la lunghezza della linea di base (possibilmente il negativo della lunghezza della linea di base, è la traduzione da un centro ottico all'altro penso).

Suggerirei di dare un'occhiata al libro Learning OpenCV per ulteriori informazioni. È ancora basato sulla vecchia interfaccia C, ma fa un buon lavoro di spiegazione della teoria sottostante ed è da dove ho tratto la forma della matrice Q.

+1

buon lavoro. se puoi menzionare il modo per calcolare la matrice Q. – VenushkaT

1

se si desidera creare direttamente Q matrice:

cv::Mat Q; 
Q.at<double>(0,0)=1.0; 
Q.at<double>(0,1)=0.0; 
Q.at<double>(0,2)=0.0; 
Q.at<double>(0,3)=-160; //cx 
Q.at<double>(1,0)=0.0; 
Q.at<double>(1,1)=1.0; 
Q.at<double>(1,2)=0.0; 
Q.at<double>(1,3)=-120; //cy 
Q.at<double>(2,0)=0.0; 
Q.at<double>(2,1)=0.0; 
Q.at<double>(2,2)=0.0; 
Q.at<double>(2,3)=348.087; //Focal 
Q.at<double>(3,0)=0.0; 
Q.at<double>(3,1)=0.0; 
Q.at<double>(3,2)=1.0/95; //1.0/BaseLine 
Q.at<double>(3,3)=0.0; //cx - cx' 

Ma si dovrebbe calibrare entrambe le fotocamere e quindi ottenere matrice Q dal cv :: stereoRectify. Fai attenzione, leggi la matrice Q come valori doppi.