PCL点云自定义切片方向:从X轴到Y轴
本文将介绍如何在PCL(Point Cloud Library)中自定义点云数据的切片方向。默认情况下,PCL的切片方向为X轴,我们将通过修改代码示例,演示如何将切片方向改为Y轴。
原始代码 (X轴切片)
以下代码展示了如何沿着X轴对点云进行切片:cpppcl::PointXYZRGB minPt, maxPt;pcl::getMinMax3D(*m_cloud, minPt, maxPt);pcl::console::TicToc time;time.tic();std::vectoridx;//循环切片,次数少于点的个数//切叶片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); } }}
修改后的代码 (Y轴切片)
为了将切片方向改为Y轴,我们需要修改判断点坐标和计算切片索引的代码部分:cpppcl::PointXYZRGB minPt, maxPt;pcl::getMinMax3D(*m_cloud, minPt, maxPt);pcl::console::TicToc time;time.tic();std::vectoridx;//循环切片,次数少于点的个数//切叶片for (int i = 0; i < m_cloud->size(); ++i){ //double maxX = 0.049; double minX = -0.001; if (m_cloud->points[i].x >= minX && m_cloud->points[i].x <= maxPt.x && (m_cloud->points[i].y <= -0.001 || m_cloud->points[i].y >= 0.049)) { int index = floor((m_cloud->points[i].y - minPt.y) / m_dPlatform); float sliceMin = minPt.y + index * m_dPlatform; if ((m_cloud->points[i].y >= sliceMin) && (m_cloud->points[i].y < sliceMin + m_Delta)) { idx.push_back(i); } }}
代码解释:
- 我们首先使用
pcl::getMinMax3D 函数获取点云数据的最小和最大坐标值。2. 然后,我们遍历所有点,并根据修改后的条件判断该点是否位于当前切片内: - 判断点的X坐标是否在指定的范围内。 - 根据点的Y坐标计算切片索引,并判断该点是否位于当前切片范围内。3. 如果满足条件,则将该点的索引添加到 idx 向量中。
通过修改判断条件和切片索引计算方式,我们成功地将切片方向从X轴更改为Y轴。
注意:
m_dPlatform 表示切片的厚度。- m_Delta 表示切片的宽度。- 您可以根据需要修改这些参数以调整切片的大小和方向。