2

私は整流されたステレオ画像のペアからポイントクラウドを生成しようとしています。私はopencvのsgbm実装を使って最初にディスパリティマップを取得しました。私は、視差マップからフラットポイントクラウドを取得

[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] 

左、左画像で、次のコードを使用して、ポイントクラウドにそれを変換し、DISPはcv_16sにおける出力視差画像です。 私のpcl変換の格差は正しいのですか、それとも視差値に問題がありますか?

私は、視差マップ、点群、元の左画像のスクリーンショットを追加しました。

ありがとうございました!

screenshot

答えて

0

は、私がこの言語に自信がないんだけど、私は事に気づい:この行は、深さ(Z)

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

0.01は何をdispartyを変換すると仮定すると
を?この計算で1〜10の範囲の深さ(Z)が得られる場合、この係数は0.01〜0.1の範囲を縮小します。奥行きは常にゼロに近く、フラットな画像(フラットな画像=一定の奥行き)があります。

PSあなたのコードでは、私はZ値でu、vピクセル値からX、Y変換を見ることはできません。何かのように

X = u*Z/f 
+0

0.01は、焦点距離とベースライン値をcmsに変換するためのものです。私はopencv関数であるcalibrationMatrixValuesを使用して、カメラの組み込み行列からそれらの値をmm単位で出力しました。しかし、私は現在、深度視差マッピングを行うためにopencvのreprojectImageTo3D関数を使用していますが、私は3D結果を取得していますが、それでもなお重大な欠点があります - https://drive.google.com/file/d/0B_2Iwz6JbA4pVi0tWVEyUFc1Tlk/view?usp=分け前 –

+0

@ KarnikRam私は別の(おそらく愚かな)詳細について尋ねる:あなたはsgbmアルゴリズムが視差値を16倍大きくすることを知っていましたか? (実際の値を取得するためには16で除算する必要があります) – marcoresk

+0

はい:)ここで私のフルコードを見つけることができます - https://drive.google.com/file/d/0B_2Iwz6JbA4pSHV0TVR2TG9INk0/view?usp=sharing; LoadMetadata関数とLoadCalibration関数を無視できます。 –

関連する問題