表面重建错误 - PCL 1.6

时间:2013-10-15 21:56:32

标签: c++ visual-studio-2010 point-cloud-library win64

我完全按照我发现here的教程,对输入进行了一些修改。然后我的代码是:

#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);'线。

我该怎么解决?我疯了解决它。

提前多多感谢!!

2 个答案:

答案 0 :(得分:0)

@ Laszlo-Andras Zsurzsa说,我改变了参数,现在它继续。但现在,当它执行并保存file.vtk时。我使用this设置来获得好的东西

答案 1 :(得分:0)

我没有足够的克制,所以我使用答案作为阿卡什问题的评论。

使用泊松重建时,您只关心2个参数:八叉树的深度和八叉树的每个节点的数量样本。在PLC中,泊松算法的作者集八叉树的深度为8,每个节点的样本为1.0。您可以将深度更改为10以获得更平滑的表面效果(当然,消耗更多时间)。作者说,你应该停在10,因为更多的数字,更多的时间需要。每个节点的八叉树样本​​应该在1.0到1.5之间,所以我认为没有任何东西可以改变。

关于何时应该使用泊松算法的问题:答案是当你需要重建一个水密(近似)物体时,因为泊松算法使用指示函数来重建表面,所以它的结果总是不透水的。

如果您想在过去尝试其他泊松实施,可以在此link

中找到它们