#include \n#include <omp.h>\n#include <pcl/io/ply_io.h>\n#include <pcl/point_types.h>\n#include <pcl/common/common.h>\n#include <pcl/visualization/pcl_visualizer.h>\n#include <boost/thread/thread.hpp>\n#include <pcl/console/time.h>\n\nusing namespace std;\n\n/** \brief 点云沿Y坐标轴进行等距切片\n* \param[m_cloud] 输入点云\n* \param[m_Delta] 切片厚度\n* \param[m_dPlatform] 相邻切片之间的间隔\n* \param[m_OpenMap] 是否启动多线程加速\n* \param[out] 切片点的索引\n*/\nstd::vector sliceePointIndices(pcl::PointCloudpcl::PointXYZ::Ptr& m_cloud,\n float m_Delta = 0.00005, float m_dPlatform = 0.0002, bool m_OpenMap = true)\n{\n pcl::PointXYZ minPt, maxPt;\n pcl::getMinMax3D(m_cloud, minPt, maxPt);\n pcl::console::TicToc time;\n time.tic();\n std::vector idx;\n\n if (m_OpenMap == true)\n {\n // 并行获取各个切片\n std::vector point_idx(m_cloud->size(), -1);\n {\n#pragma omp parallel for num_threads(6)\n for (int i = 0; i < m_cloud->size(); ++i)\n {\n // 计算间隔数\n int index = floor((m_cloud->points[i].y - minPt.y) / m_dPlatform);\n // Y最小值+间隔数切片间距=下一个切片的最小值\n float sliceMin = minPt.y + index * m_dPlatform;\n // 在切片厚度范围内的点为同一层切片\n if ((m_cloud->points[i].y >= sliceMin) && (m_cloud->points[i].y < sliceMin + m_Delta))\n {\n point_idx[i] = index;\n }\n }\n\n for (int i = 0; i < point_idx.size(); ++i)\n {\n if (point_idx[i] > -1)\n {\n idx.push_back(i);\n }\n }\n }\n cout << "并行加速时的算法运行时间:" << time.toc() << " ms" << endl;\n }\n else\n {\n for (int i = 0; i < m_cloud->size(); ++i)\n {\n int index = floor((m_cloud->points[i].y - minPt.y) / m_dPlatform);\n float sliceMin = minPt.y + index * m_dPlatform;\n if ((m_cloud->points[i].y >= sliceMin) && (m_cloud->points[i].y < sliceMin + m_Delta))\n {\n idx.push_back(i);\n }\n }\n cout << "算法运行时间:" << time.toc() << " ms" << endl;\n }\n return idx;\n}\n\nint main()\n{\n // -------------------------------加载点云数据-------------------------------\n pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ);\n pcl::io::loadPLYFile("D:\DIANYUNWENJIANJIA\test1_ply.ply", *cloud);\n //--------------------------------设置相关参数------------------------------\n float Delta = 0.00005; // 切片的厚度Delta\n float dPlatform = 0.00002; // 相邻切片之间的空隙\n bool OpenMap = true; // 是否启动并行加速\n // -------------------------------调用切片函数------------------------------\n std::vector idx = sliceePointIndices(cloud, Delta, dPlatform, OpenMap);\n\n pcl::PointCloudpcl::PointXYZ::Ptr slicing_cloud(new pcl::PointCloudpcl::PointXYZ);\n pcl::copyPointCloud(*cloud, idx, *slicing_cloud);\n pcl::io::savePLYFileBinary("D:\DIANYUNWENJIANJIA\qiepianfenge_ply.ply", *slicing_cloud);\n //j ------------------------------结果可视化-------------------------------\n boost::shared_ptrpcl::visualization::PCLVisualizer viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));\n viewer->setWindowName("点云切片");\n viewer->addPointCloudpcl::PointXYZ(slicing_cloud, "slicing cloud");\n viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0.5, 0, 0.5, "slicing cloud"); // 设置切片颜色为紫色\n viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 1, "slicing cloud"); // 设置相邻切片之间的空隙颜色为蓝色\n while (!viewer->wasStopped())\n {\n viewer->spinOnce(100);\n boost::this_thread::sleep(boost::posix_time::microseconds(100000));\n }\n\n return 0;\n