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

我使用这些教程来学习如何执行此操作:
First tutorial
Second tutorial

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

问题:如何正确将图像传递给"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)
opencv - 了解点云库中的立体声匹配-LMLPHP

迷你问题:如果AdaptiveCostSOStereoMatching确实允许从2张图像中构建点云,那么ACSSM如何在没有惯性和偏心参数的情况下做到这一点?

最佳答案

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

解决方案:我编译了PCL 1.8,现在我的程序可以了。
操作系统:Windows IDE :MSVS 12 2013 x64
如果您尝试编译PCL,这些链接可以帮助您:
Official-tutorial-1
Official-tutorial-2
Good help with FLANN and VTK

Example to verify installation

关于opencv - 了解点云库中的立体声匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32186722/

10-13 06:02