一、基于RANSAC平面分割的过程
1、首先确定拟合数学模型:ax+by+cz+d=0,拟合模型需要三个点
2、计算inlier数量,Inlier判定方式:计算所有点与随机点计算的平面之间的距离d,如果d<D(距离阈值),判断为内点。
3、随机次数达到给定次数,保留inlier个数最多的那个平面模型
二、segment_plane函数解析
plane_model, inliers = pcd.segment_plane(distance_threshold=0.01,
ransac_n=3,
num_iterations=1000)
参数:
distance_threshold:inlier的最大距离阈值
ransac_n:随机采样的平面点数
num_iterations:表示最小迭代次数。
返回值:
plane_model:平面模型,即个平面方程系数(a,b,c,d),作为一个平面,对于平面上每个点(x,y,z),我们有ax+by+cz+d=0。
inliers :内点索引
三、代码实现
import open3d as o3d
if __name__ == "__main__":
sample_pcd_data = o3d.data.PCDPointCloud()
pcd = o3d.io.read_point_cloud(sample_pcd_data.path)
# Flip it, otherwise the pointcloud will be upside down.
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
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")
print("Displaying pointcloud with planar points in red ...")
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([inlier_cloud, outlier_cloud])