В настоящее время я создаю полигональные сетки из облаков точек (из файлов .pcd) с помощью PointCloudLibrary.Я генерирую их с помощью следующего кода:
pcl::PolygonMesh::Ptr meshPoisson::process(pcl::PointCloud<pcl::PointNormal>::Ptr input)
{
(...)
pcl::Poisson<pcl::PointNormal> mesh;
pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>);
pcl::PolygonMesh::Ptr triangles(new pcl::PolygonMesh);
tree2->setInputCloud(input);
mesh.setInputCloud(input);
mesh.setSearchMethod(tree2);
mesh.setDepth(m_depth);//4 low testing
mesh.setScale(m_scale);//1.0
mesh.setSamplesPerNode(5.0);
//this line is reached
mesh.reconstruct(*triangles);
//this line is never reached
(...)
return triangles;
}
В некоторых облаках точек этот код никогда не возвращается из функции реконструкция .Все мои облака точек отфильтрованы и не имеют значений NaN.
Как видите, я использую тип данных PointNormal , поэтому все точки имеют нормали.Я также проверил их, и у них есть хорошие значения (нормализованные и не NaN).
Я ожидаю, что PCL будет правильно реализован, поэтому ошибка должна быть в моем коде.
Edit1: оказывается, это как-то связано с самим алгоритмом Пуассона.Удаление метода setScale решило эту проблему.Я до сих пор не понимаю, что является причиной этого, потому что я не изучил алгоритм Пуассона.