点云切片代码解释:根据点云数据提取切片索引
这段代码使用 PCL 库对点云数据进行切片处理,并提取每个切片中点的索引。
首先,定义了两个 pcl::PointXYZRGB 类型的变量 minPt 和 maxPt,用于保存点云的最小和最大点。
pcl::PointXYZRGB minPt, maxPt;
然后,使用 pcl::getMinMax3D 函数获取点云的最小和最大点,并将结果保存在 minPt 和 maxPt 中。
pcl::getMinMax3D(*m_cloud, minPt, maxPt);
接下来,定义了一个 pcl::console::TicToc 类型的变量 time,并调用 time.tic() 函数开始计时。
pcl::console::TicToc time;
time.tic();
然后,定义了一个 std::vector<int> 类型的变量 idx,用于保存切片后的点云的索引。
std::vector<int>idx;
接下来,使用一个循环遍历点云中的每个点。
//循环切片,次数少于点的个数
//切叶片
for (int i = 0; i < m_cloud->size(); ++i)
{
//double maxY = -0.25;
double minY = -0.168;
if (m_cloud->points[i].y >= minY && m_cloud->points[i].y <= maxPt.y && (m_cloud->points[i].x <= -0.001 || m_cloud->points[i].x >= 0.049))
{
int index = floor((m_cloud->points[i].x - minPt.x) / m_dPlatform);
float sliceMin = minPt.x + index * m_dPlatform;
if ((m_cloud->points[i].x >= sliceMin) && (m_cloud->points[i].x < sliceMin + m_Delta))
{
idx.push_back(i);
}
}
}
在循环中,首先定义了一个 double 类型的变量 minY,用于设置切片的最小 y 值。
然后,使用 if 语句判断当前点的 y 坐标是否在 minY 和 maxPt.y 之间,并且 x 坐标是否在 -0.001 和 0.049 之外。
如果满足条件,则继续执行下面的代码。
在 if 语句中,首先计算了当前点在 x 方向上所属的切片索引,使用 floor 函数将点的 x 坐标减去 minPt.x,并除以 m_dPlatform 得到切片索引。
然后,计算了当前切片的最小 x 值,即 sliceMin = minPt.x + index * m_dPlatform。
接着,使用 if 语句判断当前点的 x 坐标是否在 sliceMin 和 sliceMin + m_Delta 之间。
如果满足条件,则将当前点的索引 i 添加到 idx 中。
最后,循环结束后,idx 中保存了切片后的点云的索引。
原文地址: http://www.cveoy.top/t/topic/dUw0 著作权归作者所有。请勿转载和采集!