我最近开始使用OpenCV 3.0,我的目标是从一组立体相机中捕获一对立体图像,创建一个合适的视差图,将视差图转换为3D点云,最后在一个点云中显示结果点云.使用PCL的点云查看器.
我已经进行了相机校准,结果校准RMS为0.4
您可以在下面的链接中找到我的图像对(左图)1 和(右图)2.我正在使用StereoSGBM来创建视差图像.我也使用轨迹条来调整StereoSGBM函数参数,以获得更好的视差图像.不幸的是,我不能发布我的差异图像,因为我是StackOverflow的新手并且没有足够的声誉来发布两个以上的图像链接!
获取视差图像(下面的代码中的"disp")后,我使用reprojectImageTo3D()函数将视差图像信息转换为XYZ 3D坐标,然后将结果转换为"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 == …Run Code Online (Sandbox Code Playgroud)