2013-10-15 32 views
0

Я следовал точно руководству, которое я нашел here, с некоторыми изменениями для ввода. Тогда мой код:Ошибка восстановления поверхности - 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

Файл я использовал в качестве входных данных является [это] (https://github.com/PointCloudLibrary/data/blob/ master/tutorials/ism_test_cat.pcd) – SPS

+0

Вы используете значения по умолчанию, указанные в учебнике? а также тот же файл? Может случиться так, что если вы используете другой файл, вам нужно немного изменить значения, а затем получить результат. (ввод не будет пустым при нормальной оценке) – alap

+0

Вы уверены, что действительно читаете файл point-cloud? Попробуйте использовать полный путь (не только «name.pcd»), потому что когда loadPCDFile пытается найти файл, но файл не существует на этом пути, вы не получите исключения, и программа продолжит выполнение. –

ответ

0

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

0

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

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

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

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

Смежные вопросы