【发布时间】: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),将其作为参考传递给&而不是*,或者只使用直点云而不是Ptr并将它们作为参考传递给& -
我这样做了,但错误仍然存在。我也有奇怪的情况:当我关闭预处理(stereo.setPreProcessing(false))时,程序没有崩溃,但输出云是空的(在stereo.getPointCloud之后)。
-
我的 PCL(
x64 VS2013) 包不包含stereo库。我从其他 PCL 包(x64 VS2010)手动下载了它。这可能是错误的原因吗?
标签: opencv point-cloud-library