open3d 平面分割(Ransac算法)

open3d 平面分割(Ransac算法)

      • 一、算法原理
          • 1、`Ransac`介绍
          • 2、主要函数
      • 二、代码
      • 三、效果
          • 1、原点云数据
          • 2、平面分割
      • 四、相关数据

一、算法原理

1、Ransac介绍

RANSAC(RAndom SAmple Consensus,随机采样一致)算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法。“外点”一般指的是数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点。所以,RANSAC也是一种“外点”检测算法。RANSAC算法是一种不确定算法,它只能在一种概率下产生结果,并且这个概率会随着迭代次数的增加而加大(之后会解释为什么这个算法是这样的)。

RANSAC主要解决样本中的外点问题,最多可处理50%的外点情况。
open3d 平面分割(Ransac算法)_第1张图片

范例

可以简单总结为以下步骤:
N:样本个数 K:求解模型需要的最少的点的个数(对于直线拟合来说就是两个点,对于计算Homography矩阵就是四个点)

随机采样K个点
对该K个点拟合模型
计算其他点到拟合模型的距离。如果小于一定阈值,该点被当作内点,统计内点个数
重复M次,选择内点数最多的模型
利用所有的内点重新估计模型(可选)

RANSAC用于拟合直线:
1.随机选取K = 2 ,2个点:

open3d 平面分割(Ransac算法)_第2张图片

  1. 拟合一条直线:

open3d 平面分割(Ransac算法)_第3张图片

  1. 统计内点个数,内点为绿色,此时的内点个数为9(小于一定阈值计算为内点):

open3d 平面分割(Ransac算法)_第4张图片

  1. 重复上述过程M次,找到内点数最大的模型(继续随机选点根据k=数目进行选点):

open3d 平面分割(Ransac算法)_第5张图片

  1. 利用所有的内点重新估计直线:
    open3d 平面分割(Ransac算法)_第6张图片
2、主要函数
plane_model, inliers = pcd.segment_plane(distance_threshold=0.01,  # 点到估计平面的最大距离,以便被认为是内点
                                         ransac_n=3,  # 用于估计平面的随机采样点的数量
                                         num_iterations=1000)  # 随机平面被采样和验证的次数

解释

destance_threshold:定义了一个点到一个估计平面的最大距离,这些距离内的点被认为是内点(inlier),
ransac_n:定义了使用随机抽样估计一个平面的点的个数,
num_iterations:定义了随机平面采样和验证的频率(迭代次数)。
这个函数返回(a,b,c,d)作为一个平面,对于平面上每个点(x,y,z)满足ax+by+cz+d=0。这个函数还会返回内点索引的列表。

二、代码

import open3d as o3d

if __name__ == "__main__":
    pcd = o3d.io.read_point_cloud('res/monkey.ply')

    plane_model, inliers = pcd.segment_plane(distance_threshold=0.01,  # 点到估计平面的最大距离,以便被认为是内点
                                             ransac_n=3,  # 用于估计平面的随机采样点的数量
                                             num_iterations=1000)  # 随机平面被采样和验证的次数
    [a, b, c, d] = plane_model  # 平面值
    print(f"Plane equation: {a:.2f}x + {b:.2f}y + {c:.2f}z + {d:.2f} = 0")  # 打印平面

    inlier_cloud = pcd.select_by_index(inliers)  # 获得筛选平面点云
    inlier_cloud.paint_uniform_color([1.0, 0, 0])  # 渲染
    outlier_cloud = pcd.select_by_index(inliers, invert=True)  # 除去平面分割的点云
    o3d.visualization.draw_geometries([inlier_cloud])  # 可视化

三、效果

1、原点云数据

open3d 平面分割(Ransac算法)_第7张图片

2、平面分割

open3d 平面分割(Ransac算法)_第8张图片

四、相关数据

RANSAC基本原理:RANSAC基本原理_ransac原理-CSDN博客

百度网盘数据集:

包括 obj,pcd,las,png,ply

百度网盘链接:https://pan.baidu.com/s/1JFxKUk_xMcEmpfBHtuC-Pg
提取码:cpev

你可能感兴趣的:(open3d持续更新,算法,平面,计算机视觉,python,3d,numpy)