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!
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 –
@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
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. –