Ошибка восстановления поверхности — PCL 1.6

Я следовал именно ту инструкцию, которую я нашел Вот, с некоторой модификацией для ввода. Тогда мой код:

#include <common/common.h>
#include <io/pcd_io.h>
#include <features/normal_3d_omp.h>
#include <surface/mls.h>
#include <surface/poisson.h>
#include <pcl/io/vtk_io.h>
using namespace pcl;

int main (int argc, char **argv)
{
if (argc != 1)
{
PCL_ERROR ("Syntax: %s input.pcd output.ply\n", argv[0]);
return -1;
}

PointCloud::Ptr cloud (new PointCloud ());
io::loadPCDFile ("ism_test_cat.pcd", *cloud);
MovingLeastSquares mls; mls.setInputCloud (cloud);
mls.setSearchRadius (0.01);
mls.setPolynomialFit (true);
mls.setPolynomialOrder (2);
mls.setUpsamplingMethod (MovingLeastSquares::SAMPLE_LOCAL_PLANE);
mls.setUpsamplingRadius (0.005);
mls.setUpsamplingStepSize (0.003);
PointCloud::Ptr cloud_smoothed (new PointCloud ());
mls.process (*cloud_smoothed);
NormalEstimationOMP ne;
ne.setNumberOfThreads (8);
ne.setInputCloud (cloud_smoothed);
ne.setRadiusSearch (0.01);
Eigen::Vector4f centroid;
compute3DCentroid (*cloud_smoothed, centroid);
ne.setViewPoint (centroid[0], centroid[1], centroid[2]);
PointCloud::Ptr cloud_normals (new PointCloud ());
ne.compute (*cloud_normals);

for (size_t i = 0; i < cloud_normals->size (); ++i)
{

cloud_normals->points[i].normal_x *= -1;
cloud_normals->points[i].normal_y *= -1; cloud_normals->points[i].normal_z *= -1;
}

PointCloud::Ptr cloud_smoothed_normals (new PointCloud ());
concatenateFields (*cloud_smoothed, *cloud_normals, *cloud_smoothed_normals);
Poisson poisson;
poisson.setDepth (9);
poisson.setInputCloud (cloud_smoothed_normals);
PolygonMesh mesh;
poisson.reconstruct (mesh);
io::saveVTKFile ("sreconstruc.vtk",mesh);
return 0;
}

Я использую PCL 1.6, VS2010, все x64.

VS2010 не обнаруживает никаких ошибок в коде, поэтому я скомпилировал его. Но когда я выполняю это, возникает проблема:

'Unhandled exception at 0x000007fee833546b (pcl_kdtree_debug.dll) in pcl_surface-reconstrucTutorial.exe: 0xC0000005: Access violation reading location 0x0000000000000000.'

Терминал показывает это [pcl::NormalEstimationOMP::compute] input_ is empty!,

Код выполняется до ‘mls.process (* cloud_smoothed);’ линия.

Как я мог решить это? Я схожу с ума, чтобы решить это.

Заранее большое спасибо!!

0

Решение

как сказал @ Laszlo-Andras Zsurzsa, я изменил параметры, и теперь это продолжается. Но теперь, когда он выполняет и сохраняет файл .vtk. я использую этот настройка, чтобы получить что-то хорошее

0

Другие решения

Мне не хватает репуляции, поэтому я использую ответ в качестве комментария к вопросу Акаша.

При использовании реконструкции Пуассона, вам нужно только 2 параметра: глубина октри и количество выборок на узел октодерева. В ПЛК автором алгоритма Пуассона, установленного с глубиной октри, является 8, а выборок на узел — 1,0. Вы можете изменить глубину до 10, чтобы получить более гладкий результат (больше времени, конечно). Автор сказал, что вы должны остановиться на 10, потому что чем больше число, тем больше времени нужно. Выборки на узел октре должны составлять от 1,0 до 1,5, поэтому я думаю, что ничего не изменилось.

На вопрос, когда мы должны использовать алгоритм Пуассона: ответ — когда вам нужно восстановить водонепроницаемый (закрытый) объект, потому что алгоритм Пуассона использует функцию индикатора для реконструкции поверхности, чтобы ее результат всегда был водонепроницаемым.

Если вы хотите попробовать другие реализации Пуассона в прошлом, вы можете найти их в этом ссылка на сайт

0

По вопросам рекламы [email protected]