找圆算法((HoughCircles)总结与优化
http://www.opencv.org.cn/forum.php?mod=viewthread&tid=34096
Opencv内部提供了一个基于Hough变换理论的找圆算法,HoughCircle与一般的拟合圆算法比起来,各有优势:优势:HoughCircle对噪声点不怎么敏感,并且可以在同一个图中找出多个圆;反观拟合圆算法,单纯的拟合结果容易受噪声点的影响,且不支持一个输入中找多个圆 缺点:原始的Hough变换找圆,计算量很大,而且如果对查找圆的半径不加控制,不但运算量巨大,而且精度也不足,在输入噪声点不多的情况下,找圆效果远不如拟合找圆;为了提高找圆精度,相比拟合法,需要提供更多的参数加以控制,参数要求比较严格,且总体稳定性不佳 OpenCV内的HoughCircles对基础的Hough变换找圆做了一定的优化来提高速度,它不再是在参数空间画出一个完整的圆来进行投票,而只是计算轮廓点处的梯度向量,然后根据搜索的半径R在该梯度方向距离轮廓点距离R的两边各投一点,最后根据投票结果图确定圆心位置,其示意图如图1 <ignore_js_op> 图1是比较理想的情况,轮廓点1-6的梯度方向都经过了点7,因此都给点7投了一票,点7得分最高,也正是我们所要找的圆心;同时由此可以看出基于参数空间投票法来确定圆心,8-12点就算有投票,但由于投票太散,对整个投票结果也几乎不存在干扰,因而其天生抗干扰能力要比拟合法好 不过在这种思想优化下,也存在致命的缺陷,如图2: <ignore_js_op> 实际情况是该点算出的梯度方向其实总是有误差的,有时因为图像原因或结构原因,偏差甚至超过30度;图2中由于梯度方向不精确,7点基本没有获得投票,反而不如ABC点。因此实际使用中HoughCircle的效果并没有想象中的理想,情况往往如下列所述: 3、假设我们找的东西的半径我们是知道的,变化不大(+-8%),现在限定下半径。。。找出的排的靠前的圆是这样的;再看下默认最好的圆。。。 4、常规来说,使用该函数的时候,为避免找到太多的几乎重合的圆,找圆的最小距离都设在一个比较合理的值(比如大于半径1/5),这样在找多个圆的时候,就不会找出太多重合的圆了;不过这里我试下不限制最小距离,如下,默认排序下得分最高的几个圆如左图: 很多初次使用该函数的看到这,或许就就觉得HoughCircles效果不咋地。。。本人刚开始使用时也感觉Opencv提供的这个算法太不稳定了,只能对某一个图调出相对好一点的效果,换一个图或者只改动其中某一个参数,找出来的圆就不知道跑哪去了,而且变化太大了。。。 附件为本算法优化源码,有兴趣的可以一起来进一步优化(qq:970117454) |
-
最终优化结果.jpg (60.1 KB, 下载次数: 37)
最终优化结果
<ignore_js_op>
-
原图.jpg (42.22 KB, 下载次数: 110)
测试原图
<ignore_js_op>
-
13.77 KB, 阅读权限: 1, 下载次数: 3127
HoughCircle优化源码
最新文章
- 机器学习之sklearn——EM
- Atitit 全屏模式的cs桌面客户端软件gui h5解决方案 Kiosk模式
- mysql 防止update/delete误操作
- HTML第一课总结
- [原创]Keys的基本操作总结,判断Keys中是否存在Keys.Control|Keys.Alt,移除Keys中的部分键值。
- 用Keytool和OpenSSL生成和签发数字证书
- 判断一个面(Polygon)是不是矩形
- 启用aspnet
- Django Url编码问题
- 使用cmd来起一个服务器
- javaWeb学习总结(11)- 监听器(Listener)在开发中的应用
- xilinx的quick boot(1) ——flash的一些内容
- poj1753 高斯消元
- Shell获取时间,日期,上月,当月,下月
- 3ds max学习笔记(五)--操作工具
- js-实时获取键值码
- Spring Boot 2.0 版的开源项目云收藏来了!
- boto3--通过Python的SDK连接aws
- bootstrap轮播图
- springcloud 入门 6 (断路器hystrix)