OpenCV3計算機視覺Python語言實作- 直線和圓檢測
- 直線檢測
-
- 代碼
- 運作結果
- 使用到的函數分析
-
- 1.機率霍夫變換-cv2.HoughLinesP
- 圓檢測
-
- 代碼
- 運作結果
- 使用到的函數分析
-
- 1.霍夫圓變換-cv2.HoughCircles
本文根據《OpenCV3計算機視覺Python語言實作第二版》,進行代碼編寫,感謝本書作者的辛勤付出!
直線檢測
代碼
import cv2
import numpy as np
#直線檢測
img = cv2.imread("../image/test2.jpg") #讀取照片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #圖像二值畫
edges = cv2.Canny(gray,50,120) #擷取圖像邊緣
minLineLength =20
maxLineGap =5
# 機率霍夫變換 Probabilistic_Hough_Transform
lines =cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines: #周遊所有直線
for x1,y1,x2,y2 in line: #其中一條直線
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2) #畫出直線
print(lines)
cv2.imshow("edges",edges)
cv2.imshow("lines",img)
cv2.waitKey()
cv2.destroyWindow()
運作結果

使用到的函數分析
1.機率霍夫變換-cv2.HoughLinesP
# 機率霍夫變換 Probabilistic_Hough_Transform
lines =cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
輸入參數:
- 1.edges :需要處理的圖像(必須是二值圖像,推薦使用canny邊緣檢測的結果圖像;)
- 2.rho:線段以像素為機關的距離精度,double類型的,推薦用1.0;
- 3.線段的幾何表示 一般取1和np.pi/180(線段以弧度為機關的角度精度,推薦用numpy.pi/180;)
-
4.門檻值:低于該門檻值的直線會被忽略。霍夫變換可以了解為投票箱和投票數之間的關系,每個投票箱代表一條直線,投票數達到門檻值會被保留,其餘會被删除。(累加平面的門檻值參數,int類型,超過設定門檻值才被檢測出線段,值越大,基本上意味着檢出的線段越長,檢出的線段個數越少。根據情況推薦先用100試試;)
-5. minLineLength - 線的最短長度。比這個短的線都會被忽略。(線段以像素為機關的最小長度,根據應用場景設定;)
-6. maxLineGap - 兩條線段之間的最大間隔,如果小于此值,這兩條直線就被看成是一條直線。(同一方向上兩條線段判定為一條線段的最大允許間隔(斷裂),超過了設定值,則把兩條線段當成一條線段,值越大,允許線段上的斷裂越大,越有可能檢出潛在的直線段。)
傳回值:
- 傳回值就是直線的起點和終點
說明:
僅僅是一條直線都需要兩個參數,這需要大量的計算。 Probabilistic_Hough_Transform 是對霍夫變換的一種優化。它不會對每一個點都進行計算,而是從一幅圖像中随機選取一個點集進行計算,對于直線檢測來說這已經足夠了。但是使用這種變換我們必須要降低門檻值
圓檢測
代碼
import cv2
import numpy as np
planets = cv2.imread("../image/test3.jpg")
gray_img = cv2.cvtColor(planets,cv2.COLOR_BGR2GRAY)
img = cv2.medianBlur(gray_img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,120,param1=100,param2=30,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles)) #近似函數
for i in circles[0,:]:
#畫外部圓
cv2.circle(planets,(i[0],i[1]),i[2],(0,255,0),2)
#畫圓的中心
cv2.circle(planets,(i[0],i[1]),2,(0,0,255),3)
# cv2.imwrite("planets_circles.jpg",planets)
cv2.imshow("HoughCirlces",planets)
cv2.waitKey()
cv2.destroyWindow()
運作結果
使用到的函數分析
1.霍夫圓變換-cv2.HoughCircles
circles=cv2.HoughCircles
(img,cv2.HOUGH_GRADIENT,1,120,param1=100,param2=30,minRadius=0,maxRadius=0)
#示例
cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)
輸入參數:
- image:為輸入圖像,需要灰階圖
- method:為檢測方法 目前,唯一實作的方法是 CV_HOUGH_GRADIENT,基本上是 21HT
- dp:為檢測内側圓心的累加器圖像的分辨率于輸入圖像之比的倒數,如dp=1,累加器和輸入圖像具有相同的分辨率,如果dp=2,累計器便有輸入圖像一半那麼大的寬度和高度
- minDist:表示兩個圓之間圓心的最小距離
- param1:有預設值100,它是method設定的檢測方法的對應的參數,對目前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示傳遞給canny邊緣檢測算子的高門檻值,而低門檻值為高門檻值的一半
- param2:有預設值100,它是method設定的檢測方法的對應的參數,對目前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示在檢測階段圓心的累加器門檻值,它越小,就越可以檢測到更多根本不存在的圓,而它越大的話,能通過檢測的圓就更加接近完美的圓形了
- minRadius:有預設值0,圓半徑的最小值
- maxRadius:有預設值0,圓半徑的最大值
傳回值:
- 找到的圓的輸出向量。每個向量被編碼為3元素的浮點向量 (x,y,半徑)。
這裡輸出結果隻有一組代表隻有一個圓