2

Ich habe versucht, eine Punktwolke aus einem Paar gleichgerichteter Stereobilder zu erzeugen. Ich habe zuerst die Disparitätskarte mit der sgbm-Implementierung von opencv erstellt. I überführt es dann zu einer Punktwolke mit dem folgenden Code,Erhalten einer flachen Punktwolke aus einer Disparitätskarte

[for (int u=0; u < left.rows; ++u) 
       { 
         for (int v=0; v < left.cols; ++v) 
         { 
           if(disp.at<int>(u,v)==0)continue; 
           pcl::PointXYZRGB p; 
           p.x = v; 
           p.y = u; 
           p.z = (left_focalLength * baseLine * 0.01/ disp.at<int>(u,v)); 
           std::cout << p.z << std::endl; 
           cv::Vec3b bgr(left.at<cv::Vec3b>(u,v)); 
           p.b = bgr\[0\]; 
           p.g = bgr\[1\]; 
           p.r = bgr\[2\]; 
           pc.push_back(p); 
         } 
       }][1] 

links Das linke Bild ist, ist das Ausgangs disp Disparitätsbild in cv_16s. Ist meine Disparität zur pcl-Konvertierung korrekt oder handelt es sich um ein Problem mit den Disparitätswerten?

Ich habe einen Screenshot der Disparitätskarte, der Punktwolke und des ursprünglichen linken Bildes eingefügt.

Vielen Dank!

screenshot

Antwort

0

Ich bin mit dieser Sprache nicht sicher, aber ich bemerkte eine Sache:
Unter der Annahme, dass diese Linie disparty in der Tiefe (Z)

p.z = (left_focalLength * baseLine * 0.01/ disp.at<int>(u,v)); 

Was 0,01 konvertieren? Wenn diese Berechnung Ihnen einen Bereich von Tiefen (Z) von 1 bis 10 gibt, verringert dieser Faktor Ihren Bereich von 0,01 bis 0,1. Die Tiefe ist immer nahe Null und Sie haben ein flaches Bild (flaches Bild = konstante Tiefe).

PS Ich sehe nicht in Ihrem Code X, Y Konvertierung von u, v Pixelwerte mit Z-Wert. Etwas wie

X = u*Z/f 
+0

Danke für Ihre Antwort, Die 0,01 ist für die Konvertierung der Brennweite und Grundlinie Werte zu cms. Ich habe die opencv-Funktion calibrationMatrixValues ​​verwendet, die diese Werte in mm aus der intrinsischen Matrix der Kamera ausgibt. Allerdings benutze ich jetzt die reprojectImageTo3D-Funktion von opencv, um das Tiefen-Disparitäts-Mapping durchzuführen, und ich bekomme 3D-Ergebnisse, aber es fehlt immer noch stark - https://drive.google.com/file/d/0B_2Iwz6JbA4pVi0tWVEyUFc1Tlk/view?usp= Teilen –

+0

@KarnikRam Ich denke über ein anderes (vielleicht dummes) Detail nach: Wussten Sie, dass der SGBM-Algorithmus einen 16-fachen Disparitätswert liefert? (Sie müssen durch 16 teilen, um den tatsächlichen Wert zu erhalten) – marcoresk

+0

Ja :) Sie können meinen vollständigen Code hier finden - https://drive.google.com/file/d/0B_2Iwz6JbA4pSHV0TVR2TG9INk0/view?usp=sharing; Sie können die Funktionen LoadMetadata und LoadCalibration ignorieren. –

Verwandte Themen