1. 程式人生 > 其它 >3:C++搭配PCL精簡點雲

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 }