OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
霍夫圓變換

上一個教程: 霍夫線變換
下一個教程: 使用廣義Ballard和Guil霍夫變換進行物件檢測

原始作者Ana Huamán
相容性OpenCV >= 3.0

目標

在本教程中,您將學習如何

  • 使用OpenCV函式 HoughCircles() 在影像中檢測圓。

理論

霍夫圓變換

  • 霍夫圓變換的原理與上一個教程中解釋的霍夫線變換的原理大致相似。
  • 線上檢測的情況下,一條線由兩個引數 \((r, \theta)\) 定義。在圓檢測的情況下,我們需要三個引數來定義一個圓

    \[C : ( x_{center}, y_{center}, r )\]

    其中 \((x_{center}, y_{center})\) 定義了中心位置(綠色點),\(r\) 是半徑,這使我們能夠完全定義一個圓,如下圖所示

  • 為了效率起見,OpenCV實現了一種比標準霍夫變換稍微複雜一些的檢測方法:霍夫梯度法,它由兩個主要階段組成。第一階段涉及邊緣檢測和尋找可能的圓心,第二階段為每個候選圓心找到最佳半徑。欲瞭解更多詳情,請查閱《Learning OpenCV》一書或您喜歡的計算機視覺參考文獻。

該程式做什麼?

  • 載入影像並進行模糊處理以減少噪聲
  • 對模糊影像應用霍夫圓變換
  • 在視窗中顯示檢測到的圓。

程式碼

解釋

我們使用的影像可以在此處找到

載入影像

轉換為灰度影像

應用中值模糊以減少噪聲並避免錯誤的圓檢測

繼續應用霍夫圓變換

  • 引數如下:
    • gray: 輸入影像(灰度圖)。
    • circles: 一個向量,儲存每個檢測到的圓的3個值集:\(x_{c}, y_{c}, r\)。
    • HOUGH_GRADIENT: 定義檢測方法。目前這是OpenCV中唯一可用的方法。
    • dp = 1: 解析度的反比。
    • min_dist = gray.rows/16: 檢測到的圓心之間的最小距離。
    • param_1 = 200: 內部Canny邊緣檢測器的上限閾值。
    • param_2 = 100*: 中心檢測的閾值。
    • min_radius = 0: 要檢測的最小半徑。如果未知,預設為0。
    • max_radius = 0: 要檢測的最大半徑。如果未知,預設為0。

繪製檢測到的圓

你可以看到,我們用紅色繪製圓,並用小綠點標記圓心。

顯示檢測到的圓並等待使用者退出程式

結果

使用測試影像執行上述程式碼的結果如下所示