对于OpenCV中提供的直线拟合函数fitLine函数虽然提供了L1、L12、L2、Fair、Welsch、Huber等权重方法,但是在效果上仍然比不上商业算法,而且没有圆拟合的算法,所以重新实现了一下直线与圆的拟合算法,在这里记录下实现原理。
算法基于OpenCV中fitLine函数修改,增加了Tukey权重,权重函数如下(γ默认值2.718):
对于IRLS算法就不作赘述,OpenCV里有详细的实现,在这里主要介绍当干扰过多以至于IRLS算法也不起作用时的处理方式提供一个思路。
首先,利用第一次迭代的结果(直线或圆)计算各点的权重,然后对权重进行排序。后续迭代过程仅仅针对前N个数据进行拟合,每迭代一次就对权重进行更新排序,舍弃一部分数据不参与迭代过程,直至误差不再变化或者达到预设迭代次数为止。
附圆拟合公式: