当前位置: 首页 > 知识库问答 >
问题:

理解点云库中的立体绘制

仲孙景胜
2023-03-14

情境:我正在尝试使用PCL::AdaptiveCostsoStereoMatching获取点云,它使用了两个经过校正的图像(图片可以)。

我使用这些教程来学习如何这样做:
第一教程
第二教程

错误:调用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);

错误信息:
输出日志:堆[app.exe]:
位于0000006B0F828460的堆块在0000006B0F8284A8处修改,超过了请求的大小38
app.exe已触发断点。

小问题:如果AdaptiveCostsoStereoMatching真的允许从两幅图像构建点云,那么ACSSM如何在没有Insintrics和Excentical参数的情况下实现这一点?

共有1个答案

陶修洁
2023-03-14

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

解决方案:我编译了PCL 1.8,我的程序现在正常。
OS:Windows
IDE:MSVS 12 2013 x64

如果您将尝试编译PCL,这些链接可以帮助您:
official-tutorial-1
official-tutorial-2
FLANN和VTK的良好帮助

验证安装的示例

 类似资料:
  • 本文向大家介绍python matplotlib库绘制散点图例题解析,包括了python matplotlib库绘制散点图例题解析的使用技巧和注意事项,需要的朋友参考一下 假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温随时间(天)变化的某种规律? a = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,1

  • 我在处理数据。带有“from”和“to”列的框架,我想从中创建网络图。 例如: 该 NA 的存在会产生错误。 如果我只是删除NA行,则不会绘制孤独节点。 我希望得到与以下相同的结果: 但是使用两列,从和到。我如何得到相同的结果?当“从”或“到”中的任何一个为NA时,只需绘制没有边缘且不产生错误的节点。

  • 所以,我试图在openGL和GLFW中绘制一个简单的立方体。

  • 实现的基本思路很简单,首先提供如上图所示立方体线框所有顶点的三维坐标,然后通过旋转矩阵对所有顶点进行旋转变换,最后调用绘制函数gl.drawArrays把所有点连成线渲染出来。 通过第1.3、1.4两节课案例知道,显示器上显示的实际上是平面的像素,可以简单理解为三维几何体放在你眼睛和显示器之间,几何体在显示器上的投影,视线一定的情况下, 你看到的投影效果取决几何体的位置状态,如果你学过画法几何应该

  • 添加平行光是直接定义光线照射物体的方向,点光源的光线是发散的,无法直接定义它的光线方向,不过只要定义好点光源的位置坐标,然后与某个顶点的位置坐标进行减法运算,计算结果就是光源射到该顶点的方向。 这很好理解,在三维空间中两个点确定一条直线,几何体顶点代表一个点,点光源的位置代表一个点,直线所在的方向就是光线的方向,在三维笛卡尔坐标系中,把两个顶点的xyz三个分量相减就可以得到一个表示直线方向的向量,

  • 立方体纹理是放置在立方体各个表面上的六个单独的方形纹理的集合。大多数情况下,它们用于在物体上显示无限远的反射,类似于天空盒在背景中显示远处的风景。一个展开的立方体纹理可能是这样的: 在 Cocos2d-x 中,这样创建立方体纹理: // create a textureCube object with six texture assets auto textureCube = TextureCub