表面重建错误 - PCL 1.6

Surface reconstruction error - PCL 1.6

本文关键字:PCL 重建 错误 表面      更新时间:2023-10-16

我完全按照我在这里找到的教程进行操作,对输入进行了一些修改。那么我的代码是:

#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.plyn", 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);"行。

我该如何解决?我快要疯了。

提前非常感谢!!

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

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

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

对于我们何时应该使用泊松算法的问题:答案是当您需要重建一个水密(关闭)对象时,因为泊松算法使用指标函数来重建表面,因此其结果始终是水密的。

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