admin管理员组文章数量:1660164
毕设中有一个小模块是要在点云中做平面的拟合,翻阅了一些资料后觉得用最简单的最小二乘法加上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<
本文标签: 平面PythonransacRANSAC
版权声明:本文标题:python ransac_RANSAC平面拟合python实现 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1729851529a1215480.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论