天天看點

OpenCV 直線和圓檢測直線檢測圓檢測

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()
           

運作結果

OpenCV 直線和圓檢測直線檢測圓檢測

使用到的函數分析

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()
           

運作結果

OpenCV 直線和圓檢測直線檢測圓檢測

使用到的函數分析

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,半徑)。

這裡輸出結果隻有一組代表隻有一個圓