#include #include <omp.h> #include <pcl/io/ply_io.h> #include <pcl/point_types.h> #include <pcl/common/common.h> #include <pcl/visualization/pcl_visualizer.h> #include <boost/thread/thread.hpp> #include <pcl/console/time.h>

using namespace std;

/** \brief 点云沿Y坐标轴进行等距切片

  • \param[m_cloud] 输入点云

  • \param[m_Delta] 切片厚度

  • \param[m_dPlatform] 相邻切片之间的间隔

  • \param[m_OpenMap] 是否启动多线程加速

  • \param[out] 切片点的索引 */ std::vector sliceePointIndices(pcl::PointCloudpcl::PointXYZ::Ptr& m_cloud, float m_Delta = 0.00005, float m_dPlatform = 0.0002, bool m_OpenMap = true) { pcl::PointXYZ minPt, maxPt; pcl::getMinMax3D(*m_cloud, minPt, maxPt); pcl::console::TicToc time; time.tic(); std::vector idx;

    if (m_OpenMap == true) { // 并行获取各个切片 std::vector point_idx(m_cloud->size(), -1); { #pragma omp parallel for num_threads(6) for (int i = 0; i < m_cloud->size(); ++i) { // 计算间隔数 int index = floor((m_cloud->points[i].y - minPt.y) / m_dPlatform); // Y最小值+间隔数*切片间距=下一个切片的最小值 float sliceMin = minPt.y + index * m_dPlatform; // 在切片厚度范围内的点为同一层切片 if ((m_cloud->points[i].y >= sliceMin) && (m_cloud->points[i].y < sliceMin + m_Delta)) { point_idx[i] = index; } }

          for (int i = 0; i < point_idx.size(); ++i)
          {
              if (point_idx[i] > -1)
              {
                  idx.push_back(i);
              }
          }
      }
      cout << "并行加速时的算法运行时间:" << time.toc() << " ms" << endl;
    

    } else { for (int i = 0; i < m_cloud->size(); ++i) { 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); } } cout << "算法运行时间:" << time.toc() << " ms" << endl; } return idx; }

int main() { // -------------------------------加载点云数据------------------------------- pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ); pcl::io::loadPLYFile("D:\DIANYUNWENJIANJIA\test1_ply.ply", *cloud); //--------------------------------设置相关参数------------------------------ float Delta = 0.00005; // 切片的厚度Delta float dPlatform = 0.00002; // 相邻切片之间的空隙 bool OpenMap = true; // 是否启动并行加速 // -------------------------------调用切片函数------------------------------ std::vector idx = sliceePointIndices(cloud, Delta, dPlatform, OpenMap);

pcl::PointCloud<pcl::PointXYZ>::Ptr slicing_cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::copyPointCloud(*cloud, idx, *slicing_cloud);

// ------------------------------设置可视化颜色------------------------------
pcl::visualization::PCLVisualizer viewer("3D Viewer");
viewer.setBackgroundColor(0, 0, 0); // 设置背景颜色为黑色

pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(slicing_cloud, 255, 0, 255); // 设置植物颜色为紫色
viewer.addPointCloud<pcl::PointXYZ>(slicing_cloud, single_color, "slicing cloud");

for (int i = 0; i < slicing_cloud->size() - 1; i++) {
    pcl::PointXYZ p1 = slicing_cloud->at(i);
    pcl::PointXYZ p2 = slicing_cloud->at(i + 1);
    pcl::PointXYZ center = (p1.getVector3fMap() + p2.getVector3fMap()) / 2;
    pcl::PointXYZ diff = center - p1;
    viewer.addLine(p1, center, 0, 0, 255); // 设置相邻切片之间的空隙为蓝色
}

viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "slicing cloud");

while (!viewer.wasStopped())
{
    viewer.spinOnce();
}

return 0;

原文地址: https://www.cveoy.top/t/topic/pxFn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录