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変換の格差は正しいのですか、それとも視差値に問題がありますか?
私は、視差マップ、点群、元の左画像のスクリーンショットを追加しました。
ありがとうございました!
0.01は、焦点距離とベースライン値をcmsに変換するためのものです。私はopencv関数であるcalibrationMatrixValuesを使用して、カメラの組み込み行列からそれらの値をmm単位で出力しました。しかし、私は現在、深度視差マッピングを行うためにopencvのreprojectImageTo3D関数を使用していますが、私は3D結果を取得していますが、それでもなお重大な欠点があります - https://drive.google.com/file/d/0B_2Iwz6JbA4pVi0tWVEyUFc1Tlk/view?usp=分け前 –
@ KarnikRam私は別の(おそらく愚かな)詳細について尋ねる:あなたはsgbmアルゴリズムが視差値を16倍大きくすることを知っていましたか? (実際の値を取得するためには16で除算する必要があります) – marcoresk
はい:)ここで私のフルコードを見つけることができます - https://drive.google.com/file/d/0B_2Iwz6JbA4pSHV0TVR2TG9INk0/view?usp=sharing; LoadMetadata関数とLoadCalibration関数を無視できます。 –