Python 使用Opencv實現直線檢測和圓檢測
阿新 • • 發佈:2019-02-18
----------歡迎加入學習交流QQ群:657341423
直線檢測
cv2.HoughLinesP()函式原型:
HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)
- image: 必須是二值影象,推薦使用canny邊緣檢測的結果影象;
- rho:線段以畫素為單位的距離精度,double型別的,推薦用1.0
- theta: 線段以弧度為單位的角度精度,推薦用numpy.pi/180
- threshod:累加平面的閾值引數,int型別,超過設定閾值才被檢測出線段,值越大,基本上意味著檢出的線段越長,檢出的線段個數越少。根據情況推薦先用100試試
- lines:線條的輸出向量。
- minLineLength:線段以畫素為單位的最小長度。
- maxLineGap:同一方向上兩條線段判定為一條線段的最大允許間隔(斷裂),超過了設定值,則把兩條線段當成一條線段,值越大,允許線段上的斷裂越大,越有可能檢出潛在的直線段
示例一
import cv2 import numpy as np img = cv2.imread('lines.jpg') # 灰度處理 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # canny邊緣處理 edges = cv2.Canny(gray,50,120) line = 100 minLineLength = 20 # HoughLinesP函式是概率直線檢測,注意區分HoughLines函式 lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100, lines=line, minLineLength=minLineLength) # 降維處理 lines1 = lines[:,0,:] # line 函式勾畫直線 # (x1,y1),(x2,y2)座標位置 # (0,255,0)設定BGR通道顏色 # 2 是設定顏色粗淺度 for x1,y1,x2,y2 in lines1: cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2) # 顯示影象 cv2.imshow("edges", edges) cv2.imshow("lines", img) cv2.waitKey() cv2.destroyAllWindows()
原圖
效果圖
直線的識別與HoughLinesP函式引數的設定有關
圓檢測
HoughCircles函式原型
cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)
引數說明:
- image- 8位,單通道,灰度輸入影象。 method- 使用檢測方法。
- dp - 累加器解析度與影象解析度的反比。例如,如果 dp= 1,則累加器具有與輸入影象相同的解析度。如果 dp = 2,則累加器的寬度和高度都是一半。
- minDist -檢測到的圓的中心之間的最小距離。如果引數太小,除了真正的引數外,可能會錯誤地檢測到多個鄰居圈。如果太大,可能會錯過一些圈子。
- circles- 找到的圓的輸出向量。每個向量被編碼為3元素的浮點向量 (x,y,半徑)。
- param1 -第一個方法特定的引數。在CV_HOUGH_GRADIENT的情況下,
兩個傳遞給Canny()邊緣檢測器的閾值較高(較小的兩個小於兩倍) - param2 -第二種方法引數。在CV_HOUGH_GRADIENT的情況下,它是檢測階段的圓心的累加器閾值。越小,可能會檢測到越多的虛假圈子。首先返回對應於較大累加器值的圈子。
- minRadius -最小圓半徑。
示例二
import cv2
import numpy as np
planets = cv2.imread('planet_glow.jpg')
# 灰度處理
gray_img = cv2.cvtColor(planets, cv2.COLOR_BGR2GRAY)
# medianBlur 平滑(模糊)處理
img = cv2.medianBlur(gray_img, 5)
# 灰度影象轉彩色影象
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
# 圓檢測
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=30, minRadius=50, maxRadius=100)
# 轉化整數
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# 勾畫圓形,planets影象、(i[0],i[1])圓心座標,i[2]是半徑
cv2.circle(planets,(i[0],i[1]),i[2],(0,255,0),2)
# 勾畫圓心,圓心實質也是一個半徑為2的圓形
cv2.circle(planets,(i[0],i[1]),2,(0,0,255),3)
# 顯示影象
cv2.imwrite("planets_circles.jpg", planets)
cv2.imshow("mypic", cimg)
cv2.imshow("HoughCirlces", planets)
cv2.waitKey()
cv2.destroyAllWindows()
原圖
效果圖
圓的識別與HoughCircles函式引數的設定有關
參考資料:OpenCV 3計算機視覺 Python語言實現第二版