点云欧式聚类和Kruskal算法融合:基于PCL的实现
#include\x3ciostream\x3e\n#include\x3cpcl/io/ply_io.h\x3e\n#include\x3cpcl/io/pcd_io.h\x3e\n#include\x3cpcl/point_types.h\x3e\n#include\x3cpcl/kdtree/kdtree.h\x3e\n#include\x3cpcl/segmentation/extract_clusters.h\x3e\n#include\x3cpcl/visualization/pcl_visualizer.h\x3e\n#include\x3cboost/thread/thread.hpp\x3e\n#include\x3cpcl/segmentation/extract_clusters.h\x3e\n#include\x3cpcl/features/moment_of_inertia_estimation.h\x3e\n#include\x3cpcl/features/normal_3d.h\x3e\n#include\x3cpcl/features/boundary.h\x3e\n#include\x3cpcl/common/common.h\x3e\n#include\x3cpcl/segmentation/sac_segmentation.h\x3e\n#include\x3cpcl/filters/extract_indices.h\x3e\n#include\x22vtkAutoInit.h\x22\n#include\x3cpcl/visualization/cloud_viewer.h\x3e\nVTK_MODULE_INIT(vtkRenderingOpenGL);\ntypedef pcl::PointXYZRGB PointT;\ntypedef pcl::PointCloud\x3cPointT\x3e PointCloud;\nusing namespace std;\nusing namespace pcl;\nusing PointT = pcl::PointXYZRGB;\nint main(int argc, char** argv)\n{\n\t// -------------------------------------------加载点云---------------------------------------------\n\tpcl::PointCloud\x3cPointT\x3e::Ptr cloud(new pcl::PointCloud\x3cPointT\x3e);\n\tif (pcl::io::loadPLYFile\x3cPointT\x3e(\x22D:\DIANYUNWENJIANJIA\qiepianfenge_ply.ply\x22, *cloud) == -1)\n\t{\n\t PCL_ERROR(\x22Cloud reading failed.\x22);\n\t return (-1);\n\t}\n\tcout \x3c\x3c \x22检测到点云个数\x22 \x3c\x3c cloud->size() \x3c\x3c endl;\n\t// -------------------------------------------欧式聚类--------------------------------------------\n\tpcl::search::KdTree\x3cPointT\x3e::Ptr tree(new pcl::search::KdTree\x3cPointT\x3e);\n\ttree->setInputCloud(cloud);\n\tvector\x3cpcl::PointIndices\x3e cluster_indices; // 创建聚类索引的容器\n\tpcl::EuclideanClusterExtraction\x3cPointT\x3e ec;// 欧式聚类对象\n\tec.setClusterTolerance(0.005); // 设置近邻搜索的搜索半径(也即两个不同聚类团点之间的最小欧氏距离)\n\tec.setMinClusterSize(4); // 设置一个聚类需要的最少的点数目为4\n\tec.setMaxClusterSize(1000); // 设置一个聚类需要的最大点数目为1000\n\tec.setSearchMethod(tree); // 设置点云的搜索机制\n\tec.setInputCloud(cloud); // 设置输入点云 \n\tec.extract(cluster_indices); // 从点云中提取聚类,并将点云索引保存在cluster_indices中\n\n\t//计算点云质心\n\tpcl::PointCloud\x3cPointT\x3e::Ptr cluster_centroids(new pcl::PointCloud\x3cPointT\x3e);\n\tfor (std::vector\x3cpcl::PointIndices\x3e::const_iterator it = cluster_indices.begin(); it != cluster_indices.end(); ++it)\n\t{\n\t PointT centroid(0, 0, 0);\n\t for (std::vector\x3cint\x3e::const_iterator pit = it->indices.begin(); pit != it->indices.end(); ++pit)\n\t {\n\t centroid.x += cloud->points[*pit].x;\n\t centroid.y += cloud->points[*pit].y;\n\t centroid.z += cloud->points[*pit].z;\n\t }\n\t centroid.x /= it->indices.size();\n\t centroid.y /= it->indices.size();\n\t centroid.z /= it->indices.size();\n\t cluster_centroids->points.push_back(centroid);\n\t}\n\tcluster_centroids->width = cluster_centroids->points.size();\n\tcluster_centroids->height = 1;\n\tcluster_centroids->is_dense = true;\n\t// Save the centroids point cloud to a PLY file\n\tpcl::io::savePLYFileASCII(\x22D:\DIANYUNWENJIANJIA\OUSHIJULEI_ply.ply\x22, *cluster_centroids);\n\t//------------------------------------保存聚类结果并可视化---------------------------------------\n\tboost::shared_ptr\x3cpcl::visualization::PCLVisualizer\x3eviewer(new pcl::visualization::PCLVisualizer(\x22planar segment\x22));\n\tviewer->setBackgroundColor(0, 0, 0);\n\tviewer->setWindowName(\x22欧式聚类\x22);\n\n\tint begin = 0; //定义一个计数器,用来给保存的文件命名,从1开始\n\tfor (auto it = cluster_indices.begin(); it != cluster_indices.end(); ++it) //遍历每一个聚类,\n\t{\n\t pcl::PointCloud\x3cPointT\x3e::Ptr cloud_cluster(new pcl::PointCloud\x3cPointT\x3e); //创建一个新的点云指针用来存储每一个聚类\n\n\t for (auto pit = it->indices.begin(); pit != it->indices.end(); pit++) //遍历当前聚类中的所有点的索引\n\t {\n\t cloud_cluster->push_back(cloud->points[*pit]); //通过尾加法将点加入到cloud——cluster新点云中\n\t }\n\n\t cout \x3c\x3c \x22size\x22 \x3c\x3c begin + 1 \x3c\x3c \x22:\x22 \x3c\x3c cloud_cluster->size() \x3c\x3c endl;\n\n\t Eigen::Vector4f centroid; //创建一个四维向量容器\n\t pcl::compute3DCentroid(*cloud_cluster, centroid);\n\t std::stringstream sa;\n\t sa \x3c\x3c \x22cluster_\x22 \x3c\x3c begin;\n\t pcl::PointXYZ center_point(centroid(0), centroid(1), centroid(2)); //确定质心点\n\n\t //viewer->addSphere(pcl::PointXYZ(centroid[0], centroid[1], centroid[2]), 0.0023, 1.0, 0.0, 0.0, sa.str());//可视化质心点\n\t //std::cout \x3c\x3c \x22Cluster \x22 \x3c\x3c begin + 1 \x3c\x3c \x22 Centroid: (\x22 \x3c\x3c centroid[0] \x3c\x3c \x22, \x22 \x3c\x3c centroid[1] \x3c\x3c \x22, \x22 \x3c\x3c centroid[2] \x3c\x3c \x22)\x22 \x3c\x3c std::endl;\n\t std::stringstream ss; //定义一个字符串流,用于生成保存的ply文件名\n\t ss \x3c\x3c \x22Euclidean_cluster_\x22 \x3c\x3c begin + 1 \x3c\x3c \x22.ply\x22; //设置文件的名字\n\t pcl::io::savePLYFileBinary(ss.str(), *cloud_cluster); //将当前聚类保存为ply文件\n\t cout \x3c\x3c ss.str() \x3c\x3c \x22保存完毕!!!\x22 \x3c\x3c endl;\n\t begin++; //计数器+1用于给下一个文件命名\n\n\n\t // 可视化相关的代码\n\t uint8_t R = rand() % (256) + 0;\n\t uint8_t G = rand() % (256) + 0;\n\t uint8_t B = rand() % (256) + 0;\n\t string str;\n\t ss >> str;\n\t pcl::visualization::PointCloudColorHandlerCustom\x3cPointT\x3e color(cloud_cluster, R, G, B);\n\t viewer->addPointCloud\x3cPointT\x3e(cloud_cluster, color, str);\n\t viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, str);\n\t}\n\n\tviewer->initCameraParameters();\n\tviewer->setCameraPosition(0, 0, -3, 0, -1, 0, 0);\n\tviewer->addCoordinateSystem(1.0);\n\twhile (!viewer->wasStopped())\n\t{\n\t viewer->spinOnce(100);\n\t boost::this_thread::sleep(boost::posix_time::microseconds(100000));\n\t}\n\t//------------------------------------kruskal算法---------------------------------------\n\tPointCloud::Ptr kruskal_cloud(new PointCloud);\n\tpcl::io::loadPLYFile(\x22D:\DIANYUNWENJIANJIA\OUSHIJULEI_ply.ply\x22, *kruskal_cloud);\n\t...\n\t//执行kruskal算法\n\t...\n\t//保存kruskal算法结果\n\tpcl::io::savePLYFileASCII(\x22D:\DIANYUNWENJIANJIA\KRUSKAL_ply.ply\x22, *kruskal_cloud);\n\n\t//可视化kruskal算法结果\n\tboost::shared_ptr\x3cpcl::visualization::PCLVisualizer\x3e kruskal_viewer(new pcl::visualization::PCLVisualizer(\x22kruskal result\x22));\n\tkruskal_viewer->setBackgroundColor(0, 0, 0);\n\tkruskal_viewer->setWindowName(\x22Kruskal算法\x22);\n\tpcl::visualization::PointCloudColorHandlerRGBField\x3cpcl::PointXYZRGB\x3e rgb(kruskal_cloud);\n\tkruskal_viewer->addPointCloud\x3cpcl::PointXYZRGB\x3e(kruskal_cloud, rgb, \x22kruskal_cloud\x22);\n\tkruskal_viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, \x22kruskal_cloud\x22);\n\tkruskal_viewer->initCameraParameters();\n\twhile (!kruskal_viewer->wasStopped())\n\t{\n\t kruskal_viewer->spinOnce(100);\n\t boost::this_thread::sleep(boost::posix_time::microseconds(100000));\n\t}\n\n\treturn (0);\n
原文地址: https://www.cveoy.top/t/topic/pKBW 著作权归作者所有。请勿转载和采集!