我是靠谱客的博主 现实星月,最近开发中收集的这篇文章主要介绍RANSAC Fitting,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


本系列文章由 @YhL_Leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/73294793


RANSAC 算法是一种常用的估计模型参数的方法,相关的算法介绍网上有很多,这里不再累述,主要介绍如何利用RANSAC 方法进行 2D 直线以及 3D 平面拟合。

Source code (python version): Github/yhlleo/RANSAC-fit


1 拟合模型

之所以要自己去实现算法,主要是由于可以直接使用的代码程序和函数库,对于直线以及平面方程一般使用:

  • lines: y=ax+b
  • planes: z=ax+by+c

这样不通用的表达方式,对于自然情景中的很多线性回归问题,一般没什么问题,但是对于一些简单的应用情景,比如本文提到的直线、平面拟合问题,就不具有绝对的通用性,比如斜率不存在的line : x=n, nR ,上述的直线方程就无法拟合,同理平面拟合也存在类似问题。因此,采用下面的方法更具有一般性:

  • lines: ax+by+c=0
  • planes: ax+by+cz+d=0

对于 2D 直线采用两点式方程,给定直线上任意不同两点 p(x1,y1), q(x2,y2) ,则有:

yy1y2y1=xx1x2x1

展开为点积式:

(yy1)(x2x1)=(xx1)(y2y1)

进而可以得到:

a=y2y1, b=x1x2,c=x2y1x1y2

在对直线进行归一化处理:

a=aa2+b2,b=ba2+b2,c=ca2+b2

同时,如果 a0 ,令 a>0 , 否则令 b>0

3D 平面则采用三点式直线方程,给定平面上任意不共线的三点 {pi(xi,yi), i=1,2,3.} , 则有:

xx1x2x1x3x1yy1y2y1y3y1zz1z2z1z3z1=0

对等式左边行列式按照第一行,进行行展开可得:

(xx1)y2y1y3y1z2z1z3z1+(yy1)z2z1z3z1x2z1x3z1+(zz1)x2z1x3z1y2y1y3y1=0

进而可得:

a=(y2y1)(z3z1)(z2z1)(y3y1)

b=(z2z1)(x3x1)(x2x1)(z3z1)

c=(x2x1)(y3y1)(y2y1)(x3x1)

d=ax1by1cz1

同样进行归一化处理:

a=aN,b=bN,c=cN,d=dN, N=a2+b2+c2

拟合过程中,判断inlieroutlier的判别函数,分别采用点到直线、平面的距离公式:

  • point to line: d=|ax0+by0+c|
  • point to plane: d=|ax0+by0+cz0+d|

注: 因为对直线和平面都已经进行了归一化处理,所以计算距离部分的分母都略去。

迭代过程如图:

flowchart

2 优化拟合模型

通过简单的迭代获得的模型,可以满足inliers 数量最大,但是并不一定最优,可以根据inliers的特征值以及特征向量进行优化,这里把测试的结果图展示如下:

2d-line

2d-line2

3d-plane

3d-plane2


  • References:
    • https://en.wikipedia.org/wiki/Random_sample_consensus
    • Robust linear model estimation using RANSAC
    • Performance Evaluation of RANSAC Family

最后

以上就是现实星月为你收集整理的RANSAC Fitting的全部内容,希望文章能够帮你解决RANSAC Fitting所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部