腾讯网站建设费用,dw制作网站,淘宝网发布网站建设,upyun wordpress介绍
“Clustering of Pointclouds into Supervoxels” 是一种点云数据聚类的方法#xff0c;用于将点云数据分割成具有相似特征的超体素#xff08;supervoxel#xff09;。
超体素是一种在点云数据中表示连续区域的方法#xff0c;类似于像素在图像中表示连续区域。超体…介绍
“Clustering of Pointclouds into Supervoxels” 是一种点云数据聚类的方法用于将点云数据分割成具有相似特征的超体素supervoxel。
超体素是一种在点云数据中表示连续区域的方法类似于像素在图像中表示连续区域。超体素是点云数据的小块区域具有相似的几何特征和颜色特征。通过将点云数据聚类成超体素可以实现对点云数据的语义分割和对象识别。
“Clustering of Pointclouds into Supervoxels” 方法的主要步骤如下 首先对输入的点云数据进行预处理包括点云滤波、法线估计等操作以获取点云的几何和颜色特征。 然后通过选择一个种子点seed point开始使用一种聚类算法如欧几里得聚类或基于图的聚类将点云数据分割成超体素。聚类过程中会考虑点云的几何和颜色特征以确保超体素内的点具有相似的特征。 聚类过程中可以根据一些准则如紧密度、颜色一致性等对超体素进行合并或分割以进一步优化聚类结果。 最后生成的超体素可以用于点云的语义分割、对象识别等应用。可以根据超体素的特征将点云数据划分为不同的对象或区域。
“Clustering of Pointclouds into Supervoxels” 方法在点云处理和分析中具有广泛的应用特别是在三维场景理解、目标检测和机器人导航等领域。通过将点云数据聚类为超体素可以提取出具有语义信息的局部区域为后续的处理和分析提供更准确和可靠的数据基础。 效果 代码
#include pcl/console/parse.h
#include pcl/point_cloud.h
#include pcl/point_types.h
#include pcl/io/pcd_io.h
#include pcl/visualization/pcl_visualizer.h
#include pcl/segmentation/supervoxel_clustering.h//VTK include needed for drawing graph lines
#include vtkPolyLine.h// Types
typedef pcl::PointXYZRGBA PointT;
typedef pcl::PointCloudPointT PointCloudT;
typedef pcl::PointNormal PointNT;
typedef pcl::PointCloudPointNT PointNCloudT;
typedef pcl::PointXYZL PointLT;
typedef pcl::PointCloudPointLT PointLCloudT;void addSupervoxelConnectionsToViewer (PointT supervoxel_center,PointCloudT adjacent_supervoxel_centers,std::string supervoxel_name,pcl::visualization::PCLVisualizer::Ptr viewer);int main (int argc, char ** argv)
{if (argc 2){pcl::console::print_error (Syntax is: %s pcd-file \n --NT Dsables the single cloud transform \n-v voxel resolution\n-s seed resolution\n-c color weight \n-z spatial weight \n-n normal_weight\n, argv[0]);return (1);}PointCloudT::Ptr cloud (new PointCloudT);pcl::console::print_highlight (Loading point cloud...\n);if (pcl::io::loadPCDFilePointT (argv[1], *cloud)){pcl::console::print_error (Error loading cloud file!\n);return (1);}bool disable_transform pcl::console::find_switch (argc, argv, --NT);float voxel_resolution 0.008f;// 用于体素化点云数据的分辨率bool voxel_res_specified pcl::console::find_switch (argc, argv, -v);if (voxel_res_specified)pcl::console::parse (argc, argv, -v, voxel_resolution);float seed_resolution 0.1f; // 用于种子点选择的分辨率bool seed_res_specified pcl::console::find_switch (argc, argv, -s);if (seed_res_specified)pcl::console::parse (argc, argv, -s, seed_resolution);float color_importance 0.2f;if (pcl::console::find_switch (argc, argv, -c))pcl::console::parse (argc, argv, -c, color_importance);float spatial_importance 0.4f;if (pcl::console::find_switch (argc, argv, -z))pcl::console::parse (argc, argv, -z, spatial_importance);float normal_importance 1.0f;if (pcl::console::find_switch (argc, argv, -n))pcl::console::parse (argc, argv, -n, normal_importance);// //// This is how to use supervoxels// //pcl::SupervoxelClusteringPointT super (voxel_resolution, seed_resolution);if (disable_transform)super.setUseSingleCameraTransform (false);super.setInputCloud (cloud);super.setColorImportance (color_importance); // 设置颜色重要性super.setSpatialImportance (spatial_importance); // 设置空间重要性super.setNormalImportance (normal_importance); // 设置法线重要性std::map std::uint32_t, pcl::SupervoxelPointT::Ptr supervoxel_clusters;pcl::console::print_highlight (Extracting supervoxels!\n);super.extract (supervoxel_clusters);pcl::console::print_info (Found %d supervoxels\n, supervoxel_clusters.size ());pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer (3D Viewer));viewer-setBackgroundColor (0, 0, 0);PointCloudT::Ptr voxel_centroid_cloud super.getVoxelCentroidCloud (); // 获取超体素的体素质心点云viewer-addPointCloud (voxel_centroid_cloud, voxel centroids);viewer-setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2.0, voxel centroids);viewer-setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_OPACITY,0.95, voxel centroids);PointLCloudT::Ptr labeled_voxel_cloud super.getLabeledVoxelCloud (); // 获取标记过的点云viewer-addPointCloud (labeled_voxel_cloud, labeled voxels);viewer-setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_OPACITY,0.8, labeled voxels);PointNCloudT::Ptr sv_normal_cloud super.makeSupervoxelNormalCloud (supervoxel_clusters); //获取超体素的法线点云//We have this disabled so graph is easy to see, uncomment to see supervoxel normals//viewer-addPointCloudNormalsPointNormal (sv_normal_cloud,1,0.05f, supervoxel_normals);pcl::console::print_highlight (Getting supervoxel adjacency\n);std::multimapstd::uint32_t, std::uint32_t supervoxel_adjacency;super.getSupervoxelAdjacency (supervoxel_adjacency); // 获取超体素的邻接关系//To make a graph of the supervoxel adjacency, we need to iterate through the supervoxel adjacency multimapor (auto label_itr supervoxel_adjacency.cbegin (); label_itr ! supervoxel_adjacency.cend (); ){//First get the labelstd::uint32_t supervoxel_label label_itr-first;//Now get the supervoxel corresponding to the labelpcl::SupervoxelPointT::Ptr supervoxel supervoxel_clusters.at (supervoxel_label);//Now we need to iterate through the adjacent supervoxels and make a point cloud of themPointCloudT adjacent_supervoxel_centers;for (auto adjacent_itr supervoxel_adjacency.equal_range (supervoxel_label).first; adjacent_itr!supervoxel_adjacency.equal_range (supervoxel_label).second; adjacent_itr){pcl::SupervoxelPointT::Ptr neighbor_supervoxel supervoxel_clusters.at (adjacent_itr-second);adjacent_supervoxel_centers.push_back (neighbor_supervoxel-centroid_);}//Now we make a name for this polygonstd::stringstream ss;ss supervoxel_ supervoxel_label;//This function is shown below, but is beyond the scope of this tutorial - basically it just generates a star polygon mesh from the points givenaddSupervoxelConnectionsToViewer (supervoxel-centroid_, adjacent_supervoxel_centers, ss.str (), viewer);//Move iterator forward to next labellabel_itr supervoxel_adjacency.upper_bound (supervoxel_label);}while (!viewer-wasStopped ()){viewer-spinOnce (100);}return (0);}void addSupervoxelConnectionsToViewer (PointT supervoxel_center,PointCloudT adjacent_supervoxel_centers,std::string supervoxel_name,pcl::visualization::PCLVisualizer::Ptr viewer){vtkSmartPointervtkPoints points vtkSmartPointervtkPoints::New ();vtkSmartPointervtkCellArray cells vtkSmartPointervtkCellArray::New ();vtkSmartPointervtkPolyLine polyLine vtkSmartPointervtkPolyLine::New ();//Iterate through all adjacent points, and add a center point to adjacent point pairfor (auto adjacent_itr adjacent_supervoxel_centers.begin (); adjacent_itr ! adjacent_supervoxel_centers.end (); adjacent_itr){points-InsertNextPoint (supervoxel_center.data);points-InsertNextPoint (adjacent_itr-data);}// Create a polydata to store everything invtkSmartPointervtkPolyData polyData vtkSmartPointervtkPolyData::New ();// Add the points to the datasetpolyData-SetPoints (points);polyLine-GetPointIds ()-SetNumberOfIds(points-GetNumberOfPoints ());for(unsigned int i 0; i points-GetNumberOfPoints (); i)polyLine-GetPointIds ()-SetId (i,i);cells-InsertNextCell (polyLine);// Add the lines to the datasetpolyData-SetLines (cells);viewer-addModelFromPolyData (polyData,supervoxel_name);}