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

0

Я выполнил именно ту учебную программу, которую я нашел здесь, с некоторыми изменениями для ввода. Тогда мой код:

#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);' линия.

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

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

Теги:
visual-studio-2010
win64
point-cloud-library

2 ответа

0
Лучший ответ

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

0

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню