OpenCV中文網站

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
熱搜: 安裝 配置
查看: 76162|回復: 130
打印 上一主題 下一主題

找圓算法((HoughCircles)總結與優化

  [復制鏈接]
跳轉到指定樓層
1#
發表于 2015-1-30 00:46:36 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 wawa 于 2016-4-19 20:40 編輯

    找圓算法((HoughCircles)總結與優化

    Opencv內部提供了一個基于Hough變換理論的找圓算法,HoughCircle與一般的擬合圓算法比起來,各有優勢:優勢:HoughCircle對噪聲點不怎么敏感,并且可以在同一個圖中找出多個圓;反觀擬合圓算法,單純的擬合結果容易受噪聲點的影響,且不支持一個輸入中找多個圓
缺點:原始的Hough變換找圓,計算量很大,而且如果對查找圓的半徑不加控制,不但運算量巨大,而且精度也不足,在輸入噪聲點不多的情況下,找圓效果遠不如擬合找圓;為了提高找圓精度,相比擬合法,需要提供更多的參數加以控制,參數要求比較嚴格,且總體穩定性不佳
    OpenCV內的HoughCircles對基礎的Hough變換找圓做了一定的優化來提高速度,它不再是在參數空間畫出一個完整的圓來進行投票,而只是計算輪廓點處的梯度向量,然后根據搜索的半徑R在該梯度方向距離輪廓點距離R的兩邊各投一點,最后根據投票結果圖確定圓心位置,其示意圖如圖1
圖1是比較理想的情況,輪廓點1-6的梯度方向都經過了點7,因此都給點7投了一票,點7得分最高,也正是我們所要找的圓心;同時由此可以看出基于參數空間投票法來確定圓心,8-12點就算有投票,但由于投票太散,對整個投票結果也幾乎不存在干擾,因而其天生抗干擾能力要比擬合法好
不過在這種思想優化下,也存在致命的缺陷,如圖2:


實際情況是該點算出的梯度方向其實總是有誤差的,有時因為圖像原因或結構原因,偏差甚至超過30度;圖2中由于梯度方向不精確,7點基本沒有獲得投票,反而不如ABC點。因此實際使用中HoughCircle的效果并沒有想象中的理想,情況往往如下列所述:
(參與投票的輪廓點如圖3的右圖,噪點非常多,比想要查找的輪廓本身還多,而且斷斷續續的,顯然這種情況擬合法不適用)
1、半徑范圍限定不好時,如圖3,可能找到的圓非常多且雜亂無章

2、在此情況下,如果只輸出一個圓(Opencv的HoughCircle會默認按照投票結果的累加值排序,最好的圓是這樣的,竟然差這么多


3、假設我們找的東西的半徑我們是知道的,變化不大(+-8%),現在限定下半徑。。。找出的排的靠前的圓是這樣的;再看下默認最好的圓。。。
半徑好像接近了一點,還是好坑爹啊。。。

4、常規來說,使用該函數的時候,為避免找到太多的幾乎重合的圓,找圓的最小距離都設在一個比較合理的值(比如大于半徑1/5),這樣在找多個圓的時候,就不會找出太多重合的圓了;不過這里我試下不限制最小距離,如下,默認排序下得分最高的幾個圓如左圖:
貌似默認最好的圓并沒有任何改善

    很多初次使用該函數的看到這,或許就就覺得HoughCircles效果不咋地。。。本人剛開始使用時也感覺Opencv提供的這個算法太不穩定了,只能對某一個圖調出相對好一點的效果,換一個圖或者只改動其中某一個參數,找出來的圓就不知道跑哪去了,而且變化太大了。。。
    觀察細心的可能發現了,第4步中的左圖找出的眾多圓其實已經比前面找出的圓靠譜很多了,而且這么多圓必定有一個圓就是我想要找的圓,只是按照投票分數排序下,最好的圓偏差較大。
    但究其算法優化本身,輪廓梯度定位出來的圓心投票本來精度就低(如圖2),自然找出來的圓會有很多是錯誤的,但如果輪廓點足夠多,找出的正確的圓必定也是存在的,只是按照票數方法來評價可能排序會比較靠后,但畢竟也是出現了的;此處只需做個小小的優化,改下評價方法,優化下排序,結果就很接近了
    這是經過優化排序方法后找出的最好的圓
    找出來的圓中與實際輪廓重合度最高的圓一般就是我們要找的圓;因此我們可以通過HoughCircles來找出一批差不多的圓(如步驟4),然后畫出這些圓,和實際輪廓比對一下,按實際重合像素的總數排序,這時分數最高的圓就如上面的結果圖!HoughCircles優化一下還是很給力的!

    附件為本算法優化源碼,有興趣的可以一起來進一步優化(qq:970117454)
    注:如果編譯通過,但運行時崩潰,通常原因是庫版本不對!一般OpenCV官方給出的庫版本分x86,x64,而每個平臺下又有vc10,vc11,vc12,分別對應VS2010,VS2012,VS2013;其下還分debug版和release版,必須嚴格與編譯環境和使用的配置相對應,否則會在運行過程中出錯,且非常不好排查原因
     另該優化目前只能做到減少HoughCirlcles找錯圓且錯的比較離譜的幾率,但無法真正提高精度,找出來的圓與實際圓稍有偏差還是有可能的;若需要高精度定位,建議采用該方法做粗定位,采用擬合圓做精定位(類似各商業算法中的環形區域找圓)










最終優化結果.jpg (60.1 KB, 下載次數: 1295)

最終優化結果

最終優化結果

原圖.jpg (42.22 KB, 下載次數: 1886)

測試原圖

測試原圖

ExtendHoughCircle.cpp

13.8 KB, 下載次數: 14249

ExtendHoughCircle.h

965 Bytes, 下載次數: 7920

Main.cpp

547 Bytes, 下載次數: 6677

分享到:  QQ好友和群QQ好友和群
收藏收藏20
回復

使用道具 舉報

推薦
發表于 2015-3-13 17:16:06 | 只看該作者
謝謝樓主~~使用你的算法后結果的確更準確,耗時也沒有增加多少;
樓主,你程序中的FindCircles函數是做什么的?感覺接口函數cvFindCircles沒有用到它啊?
回復 支持 1 反對 0

使用道具 舉報

3#
發表于 2015-1-30 08:56:24 | 只看該作者
頂一個!
看看發布時間,凌晨00:54
感動!
回復 支持 反對

使用道具 舉報

4#
發表于 2015-1-30 09:25:15 | 只看該作者
頂!學習了
回復 支持 反對

使用道具 舉報

5#
發表于 2015-1-30 09:36:04 | 只看該作者
借您的源碼學習下!樓主是好人
回復 支持 反對

使用道具 舉報

6#
發表于 2015-1-30 21:55:54 | 只看該作者
謝謝樓主分享~
回復 支持 反對

使用道具 舉報

7#
發表于 2015-1-31 09:33:20 | 只看該作者
本帖最后由 qw173874546 于 2015-1-31 09:35 編輯

opencv的HoughCircles參數調對也可以找出來,這個是param1=140,param2=120左右
回復 支持 反對

使用道具 舉報

8#
 樓主| 發表于 2015-1-31 12:18:17 | 只看該作者
qw173874546 發表于 2015-1-31 09:33
opencv的HoughCircles參數調對也可以找出來,這個是param1=140,param2=120左右

直接用是可以,只是不怎么穩定
回復 支持 反對

使用道具 舉報

9#
發表于 2015-1-31 21:22:01 | 只看該作者
學習一下
回復 支持 反對

使用道具 舉報

10#
發表于 2015-2-2 08:45:51 | 只看該作者
剛學習,支持一下
回復 支持 反對

使用道具 舉報

11#
發表于 2015-2-3 23:09:08 | 只看該作者
支持樓主
回復 支持 反對

使用道具 舉報

*滑动验证:
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|OpenCV中文網站  

GMT+8, 2019-8-21 12:38 , Processed in 0.060560 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表
河北时时结果查询结果