PCL点云库学习&VS2010(X64)》Part 13 PCL1.72(VTK6.2.0)ICP示例(兔子的匹配效果)(博主写的系列文章好)

Part 13 PCL1.72(VTK6.2.0)ICP示例


1、ICP

cpp:

[html]  view plain  copy
  1. #include <iostream>  
  2. #include <pcl/io/pcd_io.h>  
  3. #include <pcl/point_types.h>  
  4. #include <pcl/registration/icp.h>  
  5. #include <pcl/visualization/pcl_visualizer.h>  
  6.   
  7. int main(int argc, char** argv)  
  8. {  
  9.     pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source (new pcl::PointCloud<pcl::PointXYZ>);  
  10.     pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_target (new pcl::PointCloud<pcl::PointXYZ>);  
  11.     pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source_registration (new pcl::PointCloud<pcl::PointXYZ>);  
  12.   
  13.   
  14.     // check arguments  
  15.     if(argc != 3) {  
  16.         std::cout << "ERROR: the number of arguments is illegal!" << std::endl;  
  17.         return -1;  
  18.     }  
  19.       
  20.     // load pcd file  
  21.     if(pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1], *cloud_source)==-1) {  
  22.         std::cout << "load source failed!" << std::endl;  
  23.         return -1;  
  24.     }  
  25.     std::cout << "source loaded!" << std::endl;  
  26.   
  27.     if(pcl::io::loadPCDFile<pcl::PointXYZ>(argv[2], *cloud_target)==-1) {  
  28.         std::cout << "load target failed!" << std::endl;  
  29.         return -1;  
  30.     }  
  31.     std::cout << "target loaded!" << std::endl;  
  32.       
  33.     // ICP  
  34.     pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;  
  35.     pcl::search::KdTree<pcl::PointXYZ>::Ptr tree1 (new pcl::search::KdTree<pcl::PointXYZ>);  
  36.     tree1->setInputCloud(cloud_source);  
  37.     pcl::search::KdTree<pcl::PointXYZ>::Ptr tree2 (new pcl::search::KdTree<pcl::PointXYZ>);  
  38.     tree2->setInputCloud(cloud_target);  
  39.     icp.setSearchMethodSource(tree1);  
  40.     icp.setSearchMethodTarget(tree2);  
  41.     icp.setInputSource(cloud_source);  
  42.     icp.setInputTarget(cloud_target);  
  43.     icp.setMaxCorrespondenceDistance(1500);  
  44.     icp.setTransformationEpsilon(1e-10);  
  45.     icp.setEuclideanFitnessEpsilon(0.1);  
  46.     icp.setMaximumIterations(300);  
  47.     icp.align(*cloud_source_registration);  
  48.     Eigen::Matrix4f transformation = icp.getFinalTransformation();  
  49.     std::cout << transformation << std::endl;  
  50.   
  51.     // display  
  52.     pcl::visualization::PCLVisualizer viewer;  
  53.     pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> src_r_h(cloud_source_registration, 255, 0, 0);  
  54.     pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> tgt_h (cloud_target, 0, 255, 0);  
  55.     pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> src_h (cloud_source, 0, 0, 255);  
  56.     viewer.addPointCloud(cloud_source_registration, src_r_h,"source_r");  
  57.     viewer.addPointCloud(cloud_target, tgt_h, "target");  
  58.     viewer.addPointCloud(cloud_source, src_h, "source");  
  59.     viewer.spin();  
  60.     return 0;  
  61. }  

控制台中运行,输入icp.exe rabbit.pcd rabbit_t.pcd,可以看到配准的效果。

从倒数第6-8行代码可以知道,配准后的数据颜色设置为红色,配准目标数据为绿色,配准的源数据为蓝色。


转:https://blog.csdn.net/sinat_24206709/article/details/51788173

猜你喜欢

转载自blog.csdn.net/eric_e/article/details/80687168