1. 程式人生 > >python霍夫變換圓形檢測、cv.CV_HOUGH_GRADIENT沒有定義的解決方法

python霍夫變換圓形檢測、cv.CV_HOUGH_GRADIENT沒有定義的解決方法

簡述

  基於python使用opencv實現在一張圖片中檢測出圓形,並且根據座標和半徑標記出圓。不涉及理論,只講應用。

相關函式

函式說明:

Python: cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) → circles 

引數說明:

image- 8位,單通道,灰度輸入影象。
circles- 找到的圓的輸出向量。每個向量被編碼為3元素的浮點向量 (x,y,半徑)。
circle_storage - 在C函式中,這是一個將包含找到的圓的輸出序列的記憶體儲存。
method
- 使用檢測方法。目前,唯一實現的方法是 CV_HOUGH_GRADIENT,基本上是 21HT,在[Yuen90]中有描述 。 dp - 累加器解析度與影象解析度的反比。例如,如果 dp = 1,則累加器具有與輸入影象相同的解析度。如果 dp = 2,則累加器的寬度和高度都是一半。 minDist -檢測到的圓的中心之間的最小距離。如果引數太小,除了真正的引數外,可能會錯誤地檢測到多個鄰居圈。如果太大,可能會錯過一些圈子。 param1 - 第一個方法特定的引數。在CV_HOUGH_GRADIENT的情況下, 兩個傳遞給Canny()邊緣檢測器的閾值較高(較小的兩個小於兩倍)。 param2 - 第二種方法引數。在CV_HOUGH_GRADIENT
的情況下 ,它是檢測階段的圓心的累加器閾值。越小,可能會檢測到越多的虛假圈子。首先返回對應於較大累加器值的圈子。 minRadius -最小圓半徑。 maxRadius - 最大圓半徑。

  這是根據opencv官方文件谷歌翻譯過來的,引數比較多,但用的時候只修改一些主要的,傳入的影象和最大最小圓半徑,以達到檢測出想要的圓的效果。
還有要注意函式的返回值。

找到的圓的輸出向量。每個向量被編碼為3元素的浮點向量 (x,y,半徑)。

  這句話不是很好理解,我們直接輸出返回值就會發現是個 三層巢狀list,最內層list有三個元素,分別是圓心的行,列,半徑,這表示一個圓的基本資訊。多個圓基本資訊組成了一個新的list,這個list包含了檢測到的所有圓,即長度就是檢測到圓的個數。最外層再加了個list,至於幹啥的不清楚了,不影響使用就好。
  下圖是輸出函式返回值的一個例項圖 :
  這裡寫圖片描述

例項演示

完整程式碼:

import  cv2

#載入並顯示圖片
img=cv2.imread('circle.png')
cv2.imshow('img',img)
#灰度化
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#輸出影象大小,方便根據影象大小調節minRadius和maxRadius
print(img.shape)
#霍夫變換圓檢測
circles= cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,100,param1=100,param2=30,minRadius=5,maxRadius=300)
#輸出返回值,方便檢視型別
print(circles)
#輸出檢測到圓的個數
print(len(circles[0]))

print('-------------我是條分割線-----------------')
#根據檢測到圓的資訊,畫出每一個圓
for circle in circles[0]:
    #圓的基本資訊
    print(circle[2])
    #座標行列
    x=int(circle[0])
    y=int(circle[1])
    #半徑
    r=int(circle[2])
    #在原圖用指定顏色標記出圓的位置
    img=cv2.circle(img,(x,y),r,(0,0,255),-1)
#顯示新影象
cv2.imshow('res',img)

#按任意鍵退出
cv2.waitKey(0)
cv2.destroyAllWindows()

執行結果 :
這裡寫圖片描述

shell輸出截圖 :
這裡寫圖片描述

cv.CV_HOUGH_GRADIENT沒有定義的解決方法

 這裡就不附上執行報錯的程式碼資訊了。解決方法很簡單,就是預先宣告一下cv,具體的如下:

import cv2
import cv2.cv as cv #here 
import numpy as np 
.....................
circles = cv2.HoughCircles(img, cv.CV_HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=80, maxRadius=100)

 直接在程式碼中寫cv2.cv.CV_HOUGH_GRADIENT也是同樣的報錯沒有定義,各位也可以自行試一下。若是不行,就用上面這樣的解決方法。