【问题标题】:Consistant normal orientation with PCL与 PCL 一致的法向方向
【发布时间】:2017-04-02 08:07:08
【问题描述】:

使用 PCL 估计点云中点的法线效果很好,但我在特定的云块处得到奇怪的法线方向翻转(见截图,法线是黄线)。当然,我可以遍历法线数组并对其进行更正,但也许有更好的方法可以直接使用 PCL 即时进行?使用面向视点的法线不是一种选择,因为表面是圆柱状​​的,因此法线最终会指向围绕该轴的所有方向。

这是正常估计的代码。基本上是官方教程中的sn-p:

pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> n;
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
tree->setInputCloud(cloud_);
n.setInputCloud(cloud_);
n.setSearchMethod(tree);
n.setKSearch(10);
n.compute(*normals);

【问题讨论】:

  • 嗨,Alexander,我也遇到了同样的问题,您能解决吗?
  • 你好。并不真地。我最终在 OpenMesh 库的帮助下“手动”完成了它,无论如何我需要在网格上进行其他操作。
  • 好的!我也会这样做。非常感谢
  • 你能解释一下你使用 openmesh 库做了什么吗?如果您有一个不错的算法,那么 cmets 中的一些指针或自我回答会很好。

标签: orientation point-cloud-library point-clouds normals


【解决方案1】:

我认为您要查找的代码可以在Difference of Normals Tutorial 中找到。具体来说,这些行

pcl::NormalEstimationOMP<PointXYZRGB, PointNormal> ne;
...
ne.setViewPoint (std::numeric_limits<float>::max (), 
                 std::numeric_limits<float>::max (), 
                 std::numeric_limits<float>::max ());
...
ne.compute (*normals_large_scale);

只要在compute 函数之前调用setViewPoint 函数,它就会翻转整个点云(而不仅仅是单个点)的法线。

例如,在这张图片中,左边的云是在调用setViewPoint 之前计算的,右边的云是在调用之后计算的。

normals_orientation_vs_not

(仅供参考:任何有声誉的人都应该随时编辑此答案并在上方添加“!”以嵌入实际图像,因此它不仅仅是一个链接。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    相关资源
    最近更新 更多