#include\x20\n#include\x20<omp.h>\n#include\x20<pcl/io/ply_io.h>\n#include\x20<pcl/point_types.h>\n#include\x20<pcl/common/common.h>\n#include\x20<pcl/visualization/pcl_visualizer.h>\n#include\x20<boost/thread/thread.hpp>\n#include\x20<pcl/console/time.h>\n\nusing\x20namespace\x20std;\n\n/**\x20\brief\x20点云沿Y坐标轴进行等距切片\n*\x20\param[m_cloud]\x20输入点云\n*\x20\param[m_Delta]\x20切片厚度\n*\x20\param[m_dPlatform]\x20相邻切片之间的间隔\n*\x20\param[m_OpenMap]\x20是否启动多线程加速\n*\x20\param[out]\x20切片点的索引\n*/\nstd::vector\x20sliceePointIndices(pcl::PointCloudpcl::PointXYZ::Ptr&\x20m_cloud,\n float\x20m_Delta\x20=\x200.00005,\x20float\x20m_dPlatform\x20=\x200.0002,\x20bool\x20m_OpenMap\x20=\x20true)\n{\n pcl::PointXYZ\x20minPt,\x20maxPt;\n pcl::getMinMax3D(m_cloud,\x20minPt,\x20maxPt);\n pcl::console::TicToc\x20time;\n time.tic();\n std::vector\x20idx;\n\n if\x20(m_OpenMap\x20==\x20true)\n {\n //\x20并行获取各个切片\n std::vector\x20point_idx(m_cloud->size(),\x20-1);\n {\n#pragma\x20omp\x20parallel\x20for\x20num_threads(6)\n for\x20(int\x20i\x20=\x200; i < m_cloud->size(); ++i)\n {\n //\x20计算间隔数\n int\x20index\x20=\x20floor((m_cloud->points[i].y\x20-\x20minPt.y)\x20/\x20m_dPlatform);\n //\x20Y最小值+间隔数切片间距=下一个切片的最小值\n float\x20sliceMin\x20=\x20minPt.y\x20+\x20index\x20*\x20m_dPlatform;\n //\x20在切片厚度范围内的点为同一层切片\n if\x20((m_cloud->points[i].y\x20>=\x20sliceMin)\x20&&\x20(m_cloud->points[i].y\x20<\x20sliceMin\x20+\x20m_Delta))\n {\n point_idx[i]\x20=\x20index;\n }\n }\n\n for\x20(int\x20i\x20=\x200; i < point_idx.size(); ++i)\n {\n if\x20(point_idx[i]\x20>\x20-1)\n {\n idx.push_back(i);\n }\n }\n }\n cout\x20<<\x20"并行加速时的算法运行时间:"\x20<<\x20time.toc()\x20<<\x20"\x20ms"\x20<<\x20endl;\n }\n else\n {\n for\x20(int\x20i\x20=\x200; i < m_cloud->size(); ++i)\n {\n int\x20index\x20=\x20floor((m_cloud->points[i].y\x20-\x20minPt.y)\x20/\x20m_dPlatform);\n float\x20sliceMin\x20=\x20minPt.y\x20+\x20index\x20*\x20m_dPlatform;\n if\x20((m_cloud->points[i].y\x20>=\x20sliceMin)\x20&&\x20(m_cloud->points[i].y\x20<\x20sliceMin\x20+\x20m_Delta))\n {\n idx.push_back(i);\n }\n }\n cout\x20<<\x20"算法运行时间:"\x20<<\x20time.toc()\x20<<\x20"\x20ms"\x20<<\x20endl;\n }\n return\x20idx;\n}\n\nint\x20main()\n{\n //\x20-------------------------------加载点云数据-------------------------------\n pcl::PointCloudpcl::PointXYZ::Ptr\x20cloud(new\x20pcl::PointCloudpcl::PointXYZ);\n pcl::io::loadPLYFile("D:\DIANYUNWENJIANJIA\test1_ply.ply",\x20cloud);\n //--------------------------------设置相关参数------------------------------\n float\x20Delta\x20=\x200.00005; //\x20切片的厚度Delta\n float\x20dPlatform\x20=\x200.00002; //\x20相邻切片之间的空隙\n bool\x20OpenMap\x20=\x20true; //\x20是否启动并行加速\n //\x20-------------------------------调用切片函数------------------------------\n std::vector\x20idx\x20=\x20sliceePointIndices(cloud,\x20Delta,\x20dPlatform,\x20OpenMap);\n\n pcl::PointCloudpcl::PointXYZ::Ptr\x20slicing_cloud(new\x20pcl::PointCloudpcl::PointXYZ);\n pcl::copyPointCloud(cloud,\x20idx,\x20slicing_cloud);\n pcl::io::savePLYFileBinary("D:\DIANYUNWENJIANJIA\qiepianfenge_ply.ply",\x20slicing_cloud);\n //j\x20------------------------------结果可视化-------------------------------\n boost::shared_ptrpcl::visualization::PCLVisualizer\x20viewer(new\x20pcl::visualization::PCLVisualizer("3D\x20Viewer"));\n viewer->setWindowName("点云切片");\n viewer->addPointCloudpcl::PointXYZ(slicing_cloud,\x20"slicing\x20cloud");\n viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,\x200.5,\x200,\x201,\x20"slicing\x20cloud"); //\x20设置颜色为紫色\n viewer->setBackgroundColor(0,\x200,\x200.5); //\x20设置背景颜色为蓝色\n while\x20(!viewer->wasStopped())\n {\n viewer->spinOnce(100);\n boost::this_thread::sleep(boost::posix_time::microseconds(100000));\n }\n\n return\x200;\n