3:C++搭配PCL精简点云
-
点云根据采集方式不同,精度不同,因此点云文件的点的数量差异较大,过多的点参与运算会大大拖慢运行速度,因此需要对点云文件进行滤波采样,一般可采用下采样的方式,设置一个方格, 方格内的所有点只取-一个点。
本例采用PCL库里的滤波函数,对点云进行下采样处理,并铜屏显示滤波前后的点云。
对显示器进行了分屏处理,这样可以更直观的对比。
1 #pragma warning(disable:4996) 2 #include <pcl/registration/ia_ransac.h>//采样一致性 3 #include <pcl/point_types.h> 4 #include <pcl/point_cloud.h> 5 #include <pcl/features/normal_3d.h> 6 #include <pcl/features/fpfh.h> 7 #include <pcl/features/pfh.h> 8 #include <pcl/search/kdtree.h> 9 #include <pcl/io/pcd_io.h> 10 #include <pcl/filters/voxel_grid.h>// 11 #include <pcl/filters/filter.h>// 12 #include <pcl/registration/icp.h>//icp配准 13 #include <pcl/registration/gicp.h> 14 #include <pcl/visualization/pcl_visualizer.h>//可视化 15 #include <time.h>//时间 16 17 typedef pcl::PointXYZ PointT; 18 typedef pcl::PointCloud<PointT> PointCloud; 19 20 int main(int argc, char** argv) 21 { 22 23 PointCloud::Ptr cloud_src_o(new PointCloud);//源点云 24 pcl::io::loadPCDFile("bun000.pcd", *cloud_src_o); 25 PointCloud::Ptr cloud_src(new PointCloud); //滤波后的点云 26 27 //下采样滤波 28 pcl::VoxelGrid<pcl::PointXYZ> voxel_grid; //声明一个滤波器 29 voxel_grid.setLeafSize(0.002, 0.002, 0.002);//定义滤波格子大小 30 voxel_grid.setInputCloud(cloud_src_o);//输入要滤波的点云 31 voxel_grid.filter(*cloud_src);//将滤波后的数据赋值给这个点云 32 std::cout << "down size *cloud_src_o from " << cloud_src_o->size() << "to" << cloud_src->size() << endl; //输出一段话 显示点云数量变化 33 34 pcl::visualization::PCLVisualizer viewer("registration Viewer"); //定义显示器 35 int v1(0);//定义两个常量 36 int v2(1); 37 viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1); //将显示器分块1 38 viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v2);//分块2 39 pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> src_h(cloud_src_o, 0, 255, 0);//颜色 40 pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> tgt_h(cloud_src, 255, 0, 0);//颜色 41 viewer.setBackgroundColor(255, 255, 255);//北京 42 viewer.addPointCloud(cloud_src_o, src_h, "source cloud", v1);//块1显示 43 viewer.addPointCloud(cloud_src, tgt_h, "tgt cloud", v2);//块2显示 44 45 //viewer.addCoordinateSystem(0.05); 46 while (!viewer.wasStopped()) 47 { 48 viewer.spinOnce(100); 49 boost::this_thread::sleep(boost::posix_time::microseconds(100000)); 50 } 51 52 return (0); 53 }