PCL Iterative Closest Point и другие эффекты, сообщающие о пустых облаках точек - PullRequest
0 голосов
/ 10 декабря 2018

Я использую PCL с предварительно созданной версией (1.9.1 для Windows) и даже со сборкой версии с исходным кодом, но у меня нет возможности использовать итеративную ближайшую точку (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 жалуется на их пустоту, но онизаполнено, как написано, около 20К баллов.

не могли бы вы мне помочь?

1 Ответ

0 голосов
/ 11 декабря 2018

Возможно, вам придется предоставить некоторые параметры для правильной работы алгоритма.

Изучив документацию 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 ();

Чтобы получить хорошие результаты, вы должны настроить параметры в соответствии с вашим набором данных.

...