Я использую PCL 1.9.1 в Windows (все в одном) и настраиваю VTK8.1.1 отдельно с помощью cmake. Все работает нормально, но добавление нормалей с pcl::addPointCloudNormals
приводит к ошибке nullptr в vtkProp3D.cxx.
Именно в
vtkProp3D::SetUserMatrix(vtkMatrix4x4 *matrix)
{
this->IsIdentity = 0; // <------ here
Я скопировал основные строки кода, как в http://pointclouds.org/documentation/tutorials/pcl_visualizer.php.
Также я убедился, что оба входа (облака, нормали) не пусты.
Я пытался использовать addPointCloudNormals
только с одним входом, где я использовал pcl::concatenateFields
для объединения точек и нормалей в типе pcl::PointCloud<pcl::PointNormal>
, что приводит к той же ошибке.
То же самое при использовании VTK 8.1.0.
Мне также интересно, почему в установочных файлах pcl all-in-one нет файла vtkProp3D.cxx, только соответствующий заголовочный файл.
Может ли быть, что я должен использовать другую версию VTK? Или собрать с конкретными параметрами в cmake?
Вот код:
Вычислить нормали:
pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> ne;
ne.setNumberOfThreads(5);
ne.setInputCloud(this->PointCloud_XYZ_PTR);
pcl::search::KdTree<pcl::PointXYZ>::Ptr ns_tree(new pcl::search::KdTree<pcl::PointXYZ>);
ne.setSearchMethod(ns_tree);
ne.setKSearch(5);
ne.compute(PointCloud_Normals_XYZ);
PointCloud_Normals_XYZ_PTR = PointCloud_Normals_XYZ.makeShared();
функция вызова для визуализации облака точек и нормалей:
this->visualize_normals(PointCloud_XYZ_PTR, PointCloud_Normals_XYZ_PTR);
Функция визуализации облака точек и нормалей:
void visualize_normals(const pcl::PointCloud<pcl::PointXYZ>::Ptr points, const pcl::PointCloud<pcl::Normal>::Ptr normals)
{
this->pcl_visualizer_PTR->addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(points, normals, 50, 0.1, "normals");
this->pcl_visualizer_PTR->updateCamera();
}