2014-12-09 13 views
5

Ich mache ein Projekt in opencv, um Hindernis in den Weg einer blinden Person mit Stereokalibrierung zu erkennen. Ich habe die Disparitätskarte korrekt berechnet. Um nun die Entfernung des Hindernisses von der Kamera zu finden, möchte ich seine 3D Koordinaten [X, Y, Z], von denen ich vermute, dass sie von reprojectImageTo3D() gefunden werden, aber ich habe nicht die Q Matrix in dieser Funktion zu verwenden Q-Matrix, die ich von stereoRectify() bekomme, kommt wahrscheinlich null, weil ich vorkalibrierte Bilder verwendet habe. Obwohl ich die inhärenten und extrinsischen Parameter meiner Kamera habe. Also meine Frage ist, wie kann ich manuell die Q-Matrix erstellen, um direkt in der Funktion reprojectImageTo3D() zu verwenden, wenn ich die Brennweite, Grundlinie und alles andere über meine Kamera weiß? Was ist das Grundformat der Q-Matrix?Q-Matrix für die reprojectImageTo3D-Funktion in opencv

Antwort

9

Die Form der Q-Matrix wie folgt gegeben ist:

Q Matrix Image

in diesem Bild, c x und c y die Koordinaten des Hauptpunktes in der liegen linke Kamera (wenn Sie Stereo mit der linken Kamera-Dominante übereinstimmten), c ' x ist die x-Koordinate des Hauptpunkts in der rechten c Amera (c x und c‘ x wird das gleiche sein, wenn Sie die CV_CALIB_ZERO_DISPARITY Flagge für stereoRectify() angegeben), f die Brennweite und T x ist die Basislinienlänge (evtl. das Negativ der Grundlinienlänge, es ist die Übersetzung von einem optischen Zentrum zum anderen, denke ich).

Ich würde vorschlagen, ein Blick auf das Buch Learning OpenCV für weitere Informationen. Es basiert immer noch auf der älteren C-Schnittstelle, erklärt aber die zugrundeliegende Theorie gut und ist die Quelle für die Form der Q-Matrix.

+1

gute Arbeit. wenn Sie den Weg zur Berechnung der Q-Matrix erwähnen können – VenushkaT

1

, wenn Sie direkt Matrix Q erstellen möchten:

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' 

Aber Sie sollten beide Kameras kalibrieren und dann Q Matrix aus cv :: stereoRectify bekommen. Seien Sie vorsichtig, lesen Sie Q-Matrix als doppelte Werte.