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 }

 

posted @ 2021-06-29 19:36  QAQ_BIU  阅读(964)  评论(2)    收藏  举报