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

我该如何解决?我要疯了才能解决它。

非常感谢提前!!

4

2 回答 2

0

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

于 2013-10-17T21:43:37.593 回答
0

我没有足够的口碑,所以我使用答案作为 Akash 问题的评论。

使用泊松重建时,您只需要关心 2 个参数:八叉树深度和八叉树每个节点的样本数。在 PLC 中,Poisson 算法的作者 set deep of octree is 8 and samples per node is 1.0. 您可以将深度更改为 10 以获得更平滑的表面结果(当然会消耗更多时间)。作者说你应该停在 10,因为更大的数字,需要更多的时间。八叉树的每个节点的样本应该在 1.0 到 1.5 之间,所以我认为它没有什么可以改变的。

对于什么时候应该使用泊松算法的问题:答案是当你需要重建一个水密(关闭)对象时,因为泊松算法使用指示函数来重建表面,所以它的结果总是水密的。

如果您想在过去尝试其他 Poisson 实现,可以在此链接中找到它们

于 2015-04-16T07:48:22.303 回答