1. 程式人生 > >Python 使用Opencv實現直線檢測和圓檢測

Python 使用Opencv實現直線檢測和圓檢測

----------歡迎加入學習交流QQ群:657341423

直線檢測
cv2.HoughLinesP()函式原型:

HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None) 

  1. image: 必須是二值影象,推薦使用canny邊緣檢測的結果影象;
  2. rho:線段以畫素為單位的距離精度,double型別的,推薦用1.0
  3. theta: 線段以弧度為單位的角度精度,推薦用numpy.pi/180
  4. threshod:累加平面的閾值引數,int型別,超過設定閾值才被檢測出線段,值越大,基本上意味著檢出的線段越長,檢出的線段個數越少。根據情況推薦先用100試試
  5. lines:線條的輸出向量。
  6. minLineLength:線段以畫素為單位的最小長度。
  7. 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)

引數說明:

  1. image- 8位,單通道,灰度輸入影象。 method- 使用檢測方法。
  2. dp - 累加器解析度與影象解析度的反比。例如,如果 dp= 1,則累加器具有與輸入影象相同的解析度。如果 dp = 2,則累加器的寬度和高度都是一半。
  3. minDist -檢測到的圓的中心之間的最小距離。如果引數太小,除了真正的引數外,可能會錯誤地檢測到多個鄰居圈。如果太大,可能會錯過一些圈子。
  4. circles- 找到的圓的輸出向量。每個向量被編碼為3元素的浮點向量 (x,y,半徑)。
  5. param1 -第一個方法特定的引數。在CV_HOUGH_GRADIENT的情況下,
    兩個傳遞給Canny()邊緣檢測器的閾值較高(較小的兩個小於兩倍)
  6. param2 -第二種方法引數。在CV_HOUGH_GRADIENT的情況下,它是檢測階段的圓心的累加器閾值。越小,可能會檢測到越多的虛假圈子。首先返回對應於較大累加器值的圈子。
  7. 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語言實現第二版