最近OpenCV 3.0で作業を開始しましたが、目標はステレオカメラからステレオ画像のペアをキャプチャし、適切な視差マップを作成し、視差マップを3D点群に変換し、最後に得られた点群をPCLを用いて点群ビューアに表示する。OpenCV 3.0を使用してステレオ画像のペアの有効な点群を生成する方法StereoSGBMとPCL
私はすでに、カメラキャリブレーションし、得られた較正RMSあなたは以下のリンクで私の画像ペア(左画像)1と(右の画像)2を見つけることができます0.4
で行ってきました。私は視差画像を作成するためにStereoSGBMを使用しています。また、より良い視差画像を得るために、トラックバーを使用してStereoSGBM関数のパラメータを調整しています。残念ながら、私はStackOverflowを初めて使用しており、2つ以上の画像リンクを投稿するには十分な評判がないので、視差画像を投稿することはできません!
視差画像(以下のコードでは「disp」)を取得した後、視差画像情報をXYZ 3D座標に変換するためにreprojectImageTo3D()関数を使用し、結果を「pcl: :PointXYZRGB "はPCLポイントクラウドビューアに表示できるようにポイントします。必要な変換を実行した後、私がポイントクラウドとして得ることは、意味を持たない愚かなピラミッド形状のポイントクラウドです。私は既に以下のリンクで提案されているすべての方法を読み、試しました:
1- http://blog.martinperis.com/2012/01/3d-reconstruction-with-opencv-and-point.html
2- HTTP://stackoverflow.com/questions/13463476/opencv-stereorectifyuncalibrated-to-3d-point-cloud
3- HTTP://stackoverflow.com/questions/22418846/reprojectimageto3d-in- opencv
それ以外はうまくいきました!
私は私のコードの変換部を提供するの下には、私が行方不明です何を私に言うことができるならば、それは非常に高く評価されるだろう:私は私の答えを見つけたと私はいくつかの仕事といくつかの研究を行った後
pcl::PointCloud<pcl::PointXYZRGB>::Ptr pointcloud(new pcl::PointCloud<pcl::PointXYZRGB>());
Mat xyz;
reprojectImageTo3D(disp, xyz, Q, false, CV_32F);
pointcloud->width = static_cast<uint32_t>(disp.cols);
pointcloud->height = static_cast<uint32_t>(disp.rows);
pointcloud->is_dense = false;
pcl::PointXYZRGB point;
for (int i = 0; i < disp.rows; ++i)
{
uchar* rgb_ptr = Frame_RGBRight.ptr<uchar>(i);
uchar* disp_ptr = disp.ptr<uchar>(i);
double* xyz_ptr = xyz.ptr<double>(i);
for (int j = 0; j < disp.cols; ++j)
{
uchar d = disp_ptr[j];
if (d == 0) continue;
Point3f p = xyz.at<Point3f>(i, j);
point.z = p.z; // I have also tried p.z/16
point.x = p.x;
point.y = p.y;
point.b = rgb_ptr[3 * j];
point.g = rgb_ptr[3 * j + 1];
point.r = rgb_ptr[3 * j + 2];
pointcloud->points.push_back(point);
}
}
viewer.showCloud(pointcloud);
あなたが提供した画像を確認してください、彼らは同じように見える – alexisrozhkov
申し訳ありません、私の悪い。私は右のフレームをアップロードしました! –