【发布时间】:2018-03-29 13:54:28
【问题描述】:
我正在使用库 PCL 来读取 .pcd 点云。 我需要提取这个点云的剖面图。 有关如何实现此类功能的任何想法建议?
基本上,我想沿着点云移动一个盒子,并将盒子中存在的点投影到一个平面上。
我已经完成了点云的读取,但是我对子点云的提取有点卡住了
【问题讨论】:
我正在使用库 PCL 来读取 .pcd 点云。 我需要提取这个点云的剖面图。 有关如何实现此类功能的任何想法建议?
基本上,我想沿着点云移动一个盒子,并将盒子中存在的点投影到一个平面上。
我已经完成了点云的读取,但是我对子点云的提取有点卡住了
【问题讨论】:
您可以使用 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);
【讨论】:
如果你不需要一个实际的盒子,但到飞机的距离阈值可以试试这个。
平面可以用单位法向量 (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。
【讨论】: