假設需要把圖片
中的直線檢測出來並用紅線標記:
import cv2
import numpy as np
if __name__ == "__main__":
original_img = cv2.imread("p.jpg")
gray = cv2.cvtColor(original_img, cv2.COLOR_BGR2GRAY)
blur_img = cv2.GaussianBlur(gray, (3, 3), 0)
edges = cv2.Canny(blur_img, 50, 150, apertureSize=3)
rho = 1 # 線段以像素爲單位的精度,double類型,1.0爲1個像素
theta = np.pi / 180 # 通過步長爲1的半徑和步長爲π/180的角度,搜索所有可能的直線。
threshold = 10 # 累加平面的閾值,int,超過設定閾值才被判定檢測出線段,值越大,檢出的線段個數越少。
minLineLength = 20 # 能組成一條直線的最少點的數量. 點數量不足的直線將被拋棄.如果小於該值,則不被認爲是一條直線.
maxLineGap = 10 # 能被認爲在一條直線上的亮點的最大距離.同一方向上兩條線段斷定爲一條線段的最大容許間隔(斷裂).直線間隙最大值,如果兩條直線間隙大於該值,則被認爲是兩條線段,否則是一條。
lines = cv2.HoughLinesP(edges, rho, theta, threshold,
minLineLength, maxLineGap)
print(type(lines))
for l in lines.tolist():
x1, y1, x2, y2 = l[0]
cv2.line(original_img, (x1, y1), (x2, y2),
color=(0, 0, 255), thickness=1)
cv2.imshow('Canny', edges)
cv2.imshow('Result', original_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
結果: