iterative closest point

最基础的使用,代码示例如下:

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/registration/icp.h>


pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out (new pcl::PointCloud<pcl::PointXYZ>);

*cloud_out = *cloud_in;

/*将cloud_out点云平移[0.7, 0, 0]
*    最终得到的旋转平移矩阵变成:
*    1  0  0  0.7
*    0  1  0   0
*    0  0  1   0
*    0  0  0   1
*/
for (std::size_t i = 0; i < cloud_in->points.size (); ++i)
    cloud_out->points[i].x = cloud_in->points[i].x + 0.7f;

pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
icp.setInputSource(cloud_in);
icp.setInputTarget(cloud_out);
//定义一个通过ICP计算后的点云,该点云和cloud_out基本相同,但会存在误差。
pcl::PointCloud<pcl::PointXYZ> Final;
icp.align(Final);

std::cout << "has converged:" << icp.hasConverged() << std::endl;
std::cout << " score: " << icp.getFitnessScore() << std::endl;
std::cout << icp.getFinalTransformation() << std::endl;
11-30 20:18