我正在使用PCL的预构建版本(对于Windows为1.9.1),甚至使用源代码构建的PCL,但是我无法使用迭代最近点(ICP)甚至其他过滤器(例如,正常估算)才能正常工作。 这是我的C ++代码:
#include <pcl/io/ply_io.h>
#include <pcl/registration/icp.h>
void test(void)
{
typedef pcl::PointXYZ PointType;
typedef pcl::PointCloud<PointType> PointCloudType;
typedef pcl::IterativeClosestPoint<PointType, PointType, float> ICPType;
PointCloudType::Ptr pcA(new PointCloudType());
pcl::io::loadPLYFile("pointcloud00000.ply", *pcA);
std::cout << "pcA size: " << pcA->points.size() << std::endl;
PointCloudType::Ptr pcB(new PointCloudType());
pcl::io::loadPLYFile("pointcloud00001.ply", *pcB);
std::cout << "pcB size: " << pcB->points.size() << std::endl;
ICPType icp;
icp.setInputSource(pcA);
icp.setInputTarget(pcB);
PointCloudType pcC;
icp.align(pcC);
std::cout << "pcC size: " << pcC.points.size() << std::endl;
}
这就是我在输出控制台中看到的内容:
pcA size: 19346
pcB size: 19409
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::IterativeClosestPoint::computeTransformation] Not enough correspondences found. Relax your threshold parameters.
pcC size: 19346
使用云时出现了一些问题,PCL抱怨它们的空虚,但是按照书面形式,它们充满了约20K点。
能帮我吗?
答案 0 :(得分:1)
您可能必须提供一些参数才能使算法正常工作。
看看API文档,您会发现有一个示例提供了如何使用算法的方法。
IterativeClosestPoint<PointXYZ, PointXYZ> icp;
// Set the input source and target
icp.setInputCloud (cloud_source);
icp.setInputTarget (cloud_target);
// Set the max correspondence distance to 5cm (e.g., correspondences with higher distances will be ignored)
icp.setMaxCorrespondenceDistance (0.05);
// Set the maximum number of iterations (criterion 1)
icp.setMaximumIterations (50);
// Set the transformation epsilon (criterion 2)
icp.setTransformationEpsilon (1e-8);
// Set the euclidean distance difference epsilon (criterion 3)
icp.setEuclideanFitnessEpsilon (1);
// Perform the alignment
icp.align (cloud_source_registered);
// Obtain the transformation that aligned cloud_source to cloud_source_registered
Eigen::Matrix4f transformation = icp.getFinalTransformation ();
为了获得良好的结果,您必须根据数据集调整参数。