python ransac_RANSAC平面拟合python实现

毕设中有一个小模块是要在点云中做平面的拟合,翻阅了一些资料后觉得用最简单的最小二乘法加上AX+BY+CZ=D的平面方程就可以实现(使用SVD进行最小二乘法拟合),但是当实现过后发现效果并不是很好,考虑原因应该是因为最小二乘法受误差值当影响比较大(代码也放在文末)。继续查阅资料决定选择RANSAC实现平面拟合。

原理解释

这里参考维基百科对于RANSAC算法原理进行简要解释:

这里要先解释两个名词

内点:拟合模型用到的点

外点:误差点

(个人的理解感觉很像随机森林,投票制)(直线拟合为例)

1 随机选出两个点。(选择出可以估计出模型的最小数据集,如果是平面就选择3个点)

2 两点确定一条直线,拟合出这条直线

3 将所有数据带入这个模型,计算出“内点”的数目;(累加在一定误差范围内的适合当前迭代推出模型的数据)

4 比较当前模型和之前推出的最好的模型的“内点“的数量,记录最大“内点”数的模型参数和“内点”数;

5 重复1-4步,直到迭代结束或者当前模型已经足够好了(“内点数目大于一定数量”)。

(PS:这一部分没有提及对于迭代次数设置的推导,感兴趣的可以去查一查)

python代码实现

废话不多说,上代码

import numpy as np

from ransac import *

import random

def augment(xyzs):

axyz = np.ones((len(xyzs), 4))

axyz[:, :3] = xyzs

return axyz<

你可能感兴趣的:(python,ransac)