使用 PCL 从 PointCloud 中提取点

Extract points from PointCloud with PCL

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

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

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

您可以使用 pcl::ProjectInliers class 来完成此操作:它将点投影到参数化模型(例如平面、球体等)上。甚至还有一个 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);

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

平面可以用单位法向量 (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 - 距离*范数

迭代所有横截面增加d。