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

本人新書《玩轉Python網絡爬蟲》,可在天貓、京東等商城搜索查閱,項目深入淺出,適合爬蟲初學者或者是已經有一些網絡爬蟲編寫經驗,但希望更加全面、深入理解Python爬蟲的開發人員。

———-歡迎加入學習交流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函數參數的設置有關


注意:
這裏寫圖片描述
例子可參考:Python 使用Opencv實現邊緣檢測以及輪廓檢測的示例二


參考資料:OpenCV 3計算機視覺 Python語言實現第二版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章