PlanDetector

参考资料

代码入口

A robust statistics approach for plane detection in unorganized point clouds

代码阅读

PointCloud::DetectPlanarPatches

函数入口 使用 kdtree 统计每个 point 相邻的 point

RobustPlanarityTest

函数入口

Grow

函数入口

  1. 根据噪声度量 min_normal_diff_ 从小到大排序
  2. queue 取出噪声最小的 patch,每个 patchpoint 只使用一次
  3. 判断内点
    1. patchpoint 法向量点乘min_normal_diff
    2. 距离小于 max_point_dist_

Merge

函数入口 对所有 patch 建图,计算它们间的相关关系

  1. 首先判断法向量点乘差异是否满足阈值
  2. 遍历所有平面 patch -> 平面包含的点的 index -> 每个点的 kdtree 的邻居
    1. plane_pointspoint 到平面 patch 的索引
    2. 找到邻居点所在平面
    3. 如果两平面 patch 边缘上的点满足 kdtree 能互相找到,对两平面进行鲁棒共面检测
  3. 并查集计算
    1. 默认顺序建立并查集树,此时根节点没有物理意义,任意 patch 都有可能是根节点
    2. 使用 largest_planes 记录成为了根节点patch 叶子节点里面包含 point 最多的 patch
    3. 后续合并就使用 largest_planes 指向的点最多的 patch 作为初始,合并其余的 patch
  4. 合并共面 patch 根据现有点重新计算 max_point_dist_min_normal_diff_ 的值

Update

函数入口

  1. 如果 num_new_points_ 占原有点一半,就认为这个 Merge 过的 patch 不稳定,需要更新
  2. 只要有一个 patch 更新,就要重新进行 GrowMergeUpdate

issue

  1. [[Open3D issue#issue-6550|issue#6650]]