基于https://pcl.readthedocs.io/projects/tutorials/en/latest/iterative_closest_point.html#iterative-closest-point,我对代码进行了一些更改以检查更多的“困难”转换。 结果不正确。我正在附上代码。这是为什么? 在此示例中,不使用任何描述符。我还检查了另一个将法线与点相关联的示例,其结果看起来很有希望。造成这种不良结果的原因是缺乏法线吗?
下面是代码:结尾的注释函数调用是指一个简单的代码,该代码将输出打印到一个层文件中,不幸的是我不允许共享。
void pclTestRegistration3(std::string outputDirectory)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>(500,1));
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>);
// Fill in the CloudIn data
for (auto& point : *cloud_in)
{
float angle = 6.28 * rand() / (RAND_MAX + 1.0f);
point.x = 10 * cos(angle);
point.z = 30 * sin(angle);
point.y = 50 * rand() / (RAND_MAX + 1.0f);
}
std::cout << "Saved " << cloud_in->points.size() << " data points to input:" << std::endl;
for (auto& point : *cloud_in)
std::cout << "(" << point.x << "," << point.y << "," << point.z << ")" << std::endl;
*cloud_out = *cloud_in;
std::cout << "size:" << cloud_out->points.size() << std::endl;
for (auto& point : *cloud_out)
{
float angle = 6.28 * rand() / (RAND_MAX + 1.0f) + 700.0F;
point.z = 10 * cos(angle);
point.y = 30 * sin(angle);
point.x = 50 * rand() / (RAND_MAX + 1.0f);
}
std::cout << "Transformed " << cloud_in->points.size() << " data points:" << std::endl;
for (auto& point : *cloud_out)
std::cout << "(" << point.x << "," << point.z << ")" << std::endl;
pcl::IterativeclosestPoint<pcl::PointXYZ,pcl::PointXYZ> icp;
icp.setInputsource(cloud_in);
icp.setInputTarget(cloud_out);
pcl::PointCloud<pcl::PointXYZ> Final;
icp.align(Final);
std::cout << "Output:" << cloud_in->points.size() << " data points:" << std::endl;
for (auto& point : Final)
std::cout << "(" << point.x << "," << point.z << ")" << std::endl;
std::cout << "has converged:" << icp.hasConverged() << " score: " <<
icp.getfitnessScore() << std::endl;
std::cout << icp.getFinalTransformation() << std::endl;
//printPlyFile(cloud_in,cloud_out,Final,outputDirectory);
}