一、算法原理
1、Ransac
介绍
RANSAC(RAndom SAmple Consensus,随机采样一致)
算法是从一组含有“外点”(outliers)
的数据中正确估计数学模型参数的迭代算法。“外点”一般指的是数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点。所以,RANSAC
也是一种“外点”检测算法。RANSAC
算法是一种不确定算法,它只能在一种概率下产生结果,并且这个概率会随着迭代次数的增加而加大(之后会解释为什么这个算法是这样的)。
RANSAC
主要解决样本中的外点问题,最多可处理50%
的外点情况。
范例
可以简单总结为以下步骤:
N:样本个数 K:求解模型需要的最少的点的个数(对于直线拟合来说就是两个点,对于计算Homography
矩阵就是四个点)
随机采样K个点
对该K个点拟合模型
计算其他点到拟合模型的距离。如果小于一定阈值,该点被当作内点,统计内点个数
重复M次,选择内点数最多的模型
利用所有的内点重新估计模型(可选)
RANSAC用于拟合直线:
1.随机选取K = 2 ,2个点:
- 拟合一条直线:
- 统计内点个数,内点为绿色,此时的内点个数为9(小于一定阈值计算为内点):
- 重复上述过程M次,找到内点数最大的模型(继续随机选点根据k=数目进行选点):
- 利用所有的内点重新估计直线:
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