【问题标题】:Extract points from PointCloud with PCL使用 PCL 从 PointCloud 中提取点
【发布时间】:2018-03-29 13:54:28
【问题描述】:

我正在使用库 PCL 来读取 .pcd 点云。 我需要提取这个点云的剖面图。 有关如何实现此类功能的任何想法建议?

基本上,我想沿着点云移动一个盒子,并将盒子中存在的点投影到一个平面上。

我已经完成了点云的读取,但是我对子点云的提取有点卡住了

【问题讨论】:

    标签: c++ point-cloud-library


    【解决方案1】:

    您可以使用 pcl::ProjectInliers 类,它正是这样做的:它将点投影到参数模型(例如平面、球体等)上。甚至还有一个handy tutorial

    这是教程的摘录,它创建了一个平面并在其上投影点:

      // Create a set of planar coefficients with X=Y=0,Z=1
      pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ());
      coefficients->values.resize (4);
      coefficients->values[0] = coefficients->values[1] = 0;
      coefficients->values[2] = 1.0;
      coefficients->values[3] = 0;
    
      // Create the filtering object
      pcl::ProjectInliers<pcl::PointXYZ> proj;
      proj.setModelType (pcl::SACMODEL_PLANE);
      proj.setInputCloud (cloud);
      proj.setModelCoefficients (coefficients);
      proj.filter (*cloud_projected);
    

    【讨论】:

    • 我设法将我的点云投影在平面上,但不确定我是否理解以下答案,只能在我的平面周围获得一小段距离的缓冲区,我还能为此使用平面系数吗?
    • 您可以使用CropHull 过滤您选择的区域内的点。然后将输出用于投影。
    • 教程链接已过期。新链接为:pcl.readthedocs.io/projects/tutorials/en/latest/…
    【解决方案2】:

    如果你不需要一个实际的盒子,但到飞机的距离阈值可以试试这个。

    平面可以用单位法向量 (3d) 和距离表示,例如 norm = (0,0,1), d = 10。这定义了平面 z = 10;

    在平面上创建一个点,只需 (10*0, 10*0, 10*1) -> point_on_plane =(0,0,10)

    到平面的点距离 dist = (p - point_on_plane) .dot(norm)

    如果 fabs(dist) 小于阈值,则将点投影到平面上 投影 = p - dist*norm

    迭代所有截面增加d。

    【讨论】:

      猜你喜欢
      • 2017-12-08
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多