向PCL注册(点云库)

基于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);
}
iCMS 回答:向PCL注册(点云库)

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2013155.html

大家都在问