int main() { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile("cloud71_icp_result.pcd", *cloud); float resolution = 0.5; //体素的大小 cout << "before点云" << cloud->points.size() << endl; pcl::octree::OctreePointCloud<pcl::PointXYZ> octree(resolution); octree.setInputCloud(cloud); octree.addPointsFromInputCloud(); vector<PointT, AlignedPointT> voxel_centers; octree.getOccupiedVoxelCenters(voxel_centers); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_core(new pcl::PointCloud<pcl::PointXYZ>); cloud_core->width = voxel_centers.size(); cloud_core->height = 1; cloud_core->points.resize(cloud_core->height*cloud_core->width); for (size_t i = 0; i < voxel_centers.size() - 1; i++) { cloud_core->points[i].x = voxel_centers[i].x; cloud_core->points[i].y = voxel_centers[i].y; cloud_core->points[i].z = voxel_centers[i].z; } pcl::PCDWriter writer; writer.write("cloud71_icp_result_core2.pcd", *cloud_core); cout << voxel_centers.size() << endl; system("pause"); return 0; }
时间: 2024-04-19 21:28:22 浏览: 153
点云双窗口可视化的C++实现
这段代码是用于读取一个点云文件并对其进行体素化处理的操作。首先,它创建了一个指向pcl::PointCloud<pcl::PointXYZ>类型的智能指针cloud,并通过pcl::io::loadPCDFile函数加载了一个名为"cloud71_icp_result.pcd"的点云文件到cloud中。
然后,定义了一个体素的大小resolution,并创建了一个pcl::octree::OctreePointCloud<pcl::PointXYZ>类型的octree对象,并将输入点云设置为cloud。接下来,通过调用addPointsFromInputCloud函数,将输入点云添加到octree中。
然后,创建一个vector<PointT, AlignedPointT>类型的voxel_centers向量,用于存储占据的体素中心点。调用getOccupiedVoxelCenters函数,将占据的体素中心点存储在voxel_centers中。
接下来,创建一个指向pcl::PointCloud<pcl::PointXYZ>类型的智能指针cloud_core,并设置其宽度和高度为voxel_centers的大小。然后,通过循环将体素中心点的坐标赋值给cloud_core的对应点。
最后,使用pcl::PCDWriter的write函数将cloud_core写入名为"cloud71_icp_result_core2.pcd"的点云文件中。打印出voxel_centers的大小,并使用system("pause")暂停程序的执行。
这段代码的作用是将输入点云进行体素化处理,并将占据的体素中心点提取出来并保存到另一个点云文件中。
阅读全文