#include\x3ciostream\x3e\n#include\x3comp.h\x3e\n#include\x3cpcl/io/ply_io.h\x3e\n#include\x3cpcl/point_types.h\x3e\n#include\x3cpcl/common/common.h\x3e\n#include\x3cpcl/visualization/pcl_visualizer.h\x3e\n#include\x3cboost/thread/thread.hpp\x3e\n#include\x3cpcl/console/time.h\x3e\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 \n // ------------------------------修改切片点云的颜色-------------------------------\n pcl::visualization::PointCloudColorHandlerCustompcl::PointXYZ single_color(slicing_cloud, 148, 0, 211);\n \n // ------------------------------结果可视化-------------------------------\n boost::shared_ptrpcl::visualization::PCLVisualizer viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));\n viewer->setWindowName("点云切片");\n viewer->addPointCloudpcl::PointXYZ(slicing_cloud, single_color, "slicing cloud");\n viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 1, "slicing cloud"); // 将相邻切片之间的空隙设为蓝色\n\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