open3d 平面分割(Ransac算法)

一、算法原理

1、Ransac介绍

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

RANSAC主要解决样本中的外点问题,最多可处理50%的外点情况。
在这里插入图片描述

范例

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

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

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

在这里插入图片描述

  1. 拟合一条直线:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

  1. 利用所有的内点重新估计直线:
    在这里插入图片描述
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、原点云数据

在这里插入图片描述

2、平面分割

在这里插入图片描述

四、相关数据

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

百度网盘数据集:

包括 obj,pcd,las,png,ply

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

  • 57
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云杂项

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值