您的位置:首页 > 运维架构

opencv轮廓检测之椭圆检测-----算法篇(8) Hough transformation检测椭圆

2016-04-07 21:47 232 查看
其实如果应付的话, 我前面这篇文章 椭圆检测http://blog.csdn.net/traumland/article/details/51018133

对于场景已知, 精度不太要求, 效果还算不错(我之前在纸上画圆, 挖洞, 拿了带洞的的东西试过, 不过只是用椭圆去拟合, 没有办法分辨是不是椭圆)

因为有 拟合椭圆这个算法, 而且用了限制长短轴这种限定.

但是以后肯定有需要自己造轮子的时候, 没有准备到时候碰到不就眼蓝了么~~

椭圆需要的参数: 中心坐标(x,y), 旋转角, 长短半轴长 一共五个参数

像之前用霍夫变换的方法, 光是三维的parameter space 计算量就已经够大的了

而这里要创建五维的accumulator来存放parameter

要怎么简化?
http://www2.dis.ulpgc.es/~lalvarez/research/calibracion_elipse.pdf
上面这篇文章是讲圆形阵列标定的, 讲的也很详细,能用于标定那说明精度很好, 速度也不差, 会很有借鉴意义


图片来源上面链接中的文章

如图, edge上的两个点切线相交(已知梯度), 得新交点(Xr, Yr), 然后讲交点与原二点构成弦的中点相连接,

圆心就在交点与中点的连线上. 所以再在edge上找另一个点与原两点之一进行同样的步骤, 即可找到中心坐标

上面这篇论文找到椭圆中心后, 用了最小二乘法来拟合椭圆

这里再提找中心的另一种方法, 就是通过一对梯度反向平行的两个点,

椭圆的中心坐标一定在它们之间的连线的中点处.

然而这种方法对于矩形等封闭对称的图形也适用, 并不针对椭圆, 所以需要进一步的约束条件来进行约束

确定好椭圆中心坐标后

接着确定其他三个参数

对于椭圆一般方程



图片来源http://math.wikia.com/wiki/Ellipse

因为A不等于0,

所以一般方程可以写成



已知(Xc, Yc), 有



这样就将五维的参数空间转化到三维

根据当求出来 B, C , F 时, 可求得长短半轴长与旋转角度

或者将上面式子进行求导, 得



然后这样就转化成二维, 求出B, C 再去反代入 上面那个式子, 求得F

read.pudn.com/downloads154/doc/682235/一种新的基于随机Hough变换的椭圆检测方法.pdf

------------------------------------------------------------------------------------------------------------------

我不知道是我关键字没选好, 还是百度学术不好用, 找出来的文章很少

所以也就放上这两篇文章吧

这两天 没办法google, 以后有钱就自己买吧

-------------------------------------------------------------------------------------------------------------------

试着写了一下程序, 憋了一整天.. 手推了一遍式子, 明天接着写

这两天稍微有点跑偏, 虽说数学和算法比较重要.. 可不是写一两个程序就能提高的

还是得动手写写看, 光用眼睛去看, 心理也会畏难不敢做.

---------------------------------------4.10 23:20

-------------------------------------------------------------------------------------------------------------------

写了提取椭圆中心的部分, 后面还没决定是用三维的参数矩阵, 还是用简化后的

感觉有点跑偏, 还是先找工作比较重要

先上代码吧, 我的github: 传送门

---------------------------------------4.11 20:30

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

现在来看这段代码没有什么参考意义, 可以参考opencv霍夫变换源码的写法去写, 之前忘了像参数取值

范围、分辨率之类的东西应该是使用者自己输入的, 而且当时写的时候不知道多维参数空间怎么定义,

二维参数空间居然用了Mat来定义....

--------------------------------------6. 9 11:45
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: