【问题标题】:Understanding StereoMatching in Point Cloud Library了解点云库中的立体匹配
【发布时间】:2015-08-24 16:00:25
【问题描述】:

情况:我正在尝试使用pcl::AdaptiveCostSOStereoMatching 获取point cloud,它使用了两个校正图像(图片还可以)。

我使用这些教程来学习如何做到这一点:
First tutorial
Second tutorial

错误:调用AdaptiveCostSOStereoMatching"compute"方法时程序在运行时崩溃

问题:如何正确地将图像传递给"compute" 方法?

我试过了
1) 图片由png2pcd转换 (命令行:"png2pcd.exe in.png out.pcd"
2) 用下面的函数从cv::Mat
转换的图像 但没有运气。

将 cv::Mat 转换为 pcl::PointCloud 的函数

void MatToPointCloud(Mat& mat, pcl::PointCloud<RGB>::Ptr cloud)
{
 int width = mat.cols;
 int height = mat.rows;
 pcl::RGB val;
 val.r = 0; val.g = 0; val.b = 0;

 for (int i = 0; i < mat.rows; i++)
  for (int j = 0; j < mat.cols; j++)
  {
   auto point = mat.at<Vec3b>(i, j);
   //std::cout << j << " " << i << "\n";
   val.b = point[0];
   val.g = point[1];
   val.r = point[2];
   cloud->at(j, i) = val;
  }
 }

pcl::AdaptiveCostSOStereoMatching(计算)

    // Input
    Mat leftMat, rightMat;
    leftMat = imread("left.png");
    rightMat = imread("right.png");

    int width = leftMat.cols;
    int height = rightMat.rows;
    pcl::RGB val;
    val.r = 0; val.g = 0; val.b = 0;

    pcl::PointCloud<pcl::RGB>::Ptr left_cloud(new pcl::PointCloud<pcl::RGB>(width, height, val));
    pcl::PointCloud<pcl::RGB>::Ptr right_cloud(new pcl::PointCloud<pcl::RGB>(width, height, val));

    MatToPointCloud(leftMat, left_cloud);
    MatToPointCloud(rightMat, right_cloud);

    // Calculation
    pcl::AdaptiveCostSOStereoMatching stereo;
    stereo.setMaxDisparity(60);
    //stereo.setXOffest(0); Почему-то не распознается
    stereo.setRadius(5);
    stereo.setSmoothWeak(20);
    stereo.setSmoothStrong(100);
    stereo.setGammaC(25);
    stereo.setGammaS(10);
    stereo.setRatioFilter(20);
    stereo.setPeakFilter(0);
    stereo.setLeftRightCheck(true);
    stereo.setLeftRightCheckThreshold(1);
    stereo.setPreProcessing(true);

    stereo.compute(*left_cloud, *right_cloud); // <-- CRASHING THERE 
    stereo.medianFilter(4);

    pcl::PointCloud<pcl::PointXYZRGB>::Ptr out_cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
    stereo.getPointCloud(318.11220, 224.334900, 368.534700, 0.8387445, out_cloud, left_cloud);

错误信息:
输出日志:HEAP[App.exe]:
0000006B0F828460 处的堆块在 0000006B0F8284A8 处修改,请求大小为 38
App.exe 已触发断点。

left_cloud右边的云看起来像 left_cloud

小问题:如果AdaptiveCostSOStereoMatching 真的允许从 2 张图像构建点云,ACSSM 如何在没有内在和外在参数的情况下做到这一点?

【问题讨论】:

  • 能否请您添加实际的错误字符串
  • 我添加了错误信息。 (更新后)
  • 根据我的 PCL 经验,指针不是那么直观。 compute 将指针指向云,而您正在使用内置的 Ptr。一些建议尝试:要么放弃取消引用(即left_cloud 而不是*left_cloud),将其作为参考传递给&amp; 而不是*,或者只使用直点云而不是Ptr并将它们作为参考传递给&amp;
  • 我这样做了,但错误仍然存​​在。我也有奇怪的情况:当我关闭预处理(stereo.setPreProcessing(false))时,程序没有崩溃,但输出云是空的(在stereo.getPointCloud之后)。
  • 我的 PCL(x64 VS2013) 包不包含 stereo 库。我从其他 PCL 包(x64 VS2010)手动下载了它。这可能是错误的原因吗?

标签: opencv point-cloud-library


【解决方案1】:

问题:我下载并安装了没有stereo的旧版PCL。
之后,我从其他 PCL 包中下载了stereo,并将这个库添加到我的 PCL 包中。而且它工作不正确。

解决方案:我编译了PCL 1.8,我的程序现在可以了。
操作系统Windows
IDEMSVS 12 2013 x64

如果您将尝试编译 PCL,这些链接可以帮助您:
Official-tutorial-1
Official-tutorial-2
Good help with FLANN and VTK

Example to verify installation

【讨论】:

    猜你喜欢
    • 2014-04-04
    • 2012-10-12
    • 2013-12-10
    • 2020-04-08
    • 2014-01-16
    • 2018-01-01
    • 2012-11-20
    • 2013-10-12
    • 2021-06-27
    相关资源
    最近更新 更多