Graphics 点云的一致正态计算 有Python或C++中的一个库,它能够以一致的方式估计点云的法线吗? 以一致的方式,我的意思是法线的方向在曲面上全局保留

Graphics 点云的一致正态计算 有Python或C++中的一个库,它能够以一致的方式估计点云的法线吗? 以一致的方式,我的意思是法线的方向在曲面上全局保留,graphics,3d,point-cloud-library,point-clouds,open3d,Graphics,3d,Point Cloud Library,Point Clouds,Open3d,例如,当我使用python open3d包时: 我得到了一个不一致的结果,其中一些法线指向内部,而其余的指向外部 非常感谢如果您知道从何处捕获每个点的视点,可以使用它来确定法线的方向。 我假设情况并非如此——因此,考虑到您的情况,这似乎是无懈可击且采样均匀的,网格重建是有希望的 PCL库在应用程序中提供了许多备选方案。为了正常估计,我将从以下两个方面开始: 虽然简单,但它们应该足以生成单个相干网格 一旦有了网格,每个三角形就定义了一条法线(叉积)。需要注意的是,网格不仅仅是独立面的集合。

例如,当我使用python open3d包时:

我得到了一个不一致的结果,其中一些法线指向内部,而其余的指向外部


非常感谢

如果您知道从何处捕获每个点的视点,可以使用它来确定法线的方向。 我假设情况并非如此——因此,考虑到您的情况,这似乎是无懈可击且采样均匀的,网格重建是有希望的

PCL库在应用程序中提供了许多备选方案。为了正常估计,我将从以下两个方面开始:

虽然简单,但它们应该足以生成单个相干网格

一旦有了网格,每个三角形就定义了一条法线(叉积)。需要注意的是,网格不仅仅是独立面的集合。面是连接的,这种连接在网格上强制执行一致的方向

pcl::PolygonMesh
是一个“”。这意味着每个三角形面由一组有序的顶点定义,这些顶点定义了方向: 顶点顺序=>叉积顺序=>定义明确的法线

您可以使用网格(最近邻)的法线,也可以计算低分辨率网格并仅使用它来确定云的方向。

更新:好消息

切线平面算法现在在Open3D中实现
这个和那个

您只需调用pcd.orient\u normals\u consistent\u tangent\u plane(k=15)
k
是knn图参数


原始答案:

正如Mark所说,如果您的点云来自多个深度图像,那么您可以调用
open3d.geometry。在将它们连接在一起之前(假设您使用的是python版本的)


但是,如果您没有这些信息,可以使用切平面算法:

  • 为点云构建knn图。
    图形节点是点。如果一个点是另一个的k近邻,则两个点是连接的
  • 为图表中的边指定权重。
    与边缘(i,j)相关的权重计算为1-|ni⋅ nj|
  • 生成结果图的最小生成树。
  • 在初始节点上生成树, 按深度优先顺序遍历树,为每个节点分配一个 与母公司方向一致的方向。
  • 实际上,上述算法来自1992年的第3.3节 签名纸。算法也同样适用

    AFAIK算法并不能保证一个完美的方向,但它应该足够好

    downpcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(
        radius=4, max_nn=300))