為完成尋找車道線的任務,接下來我們利用canny邊緣檢測圖像上再執行霍夫轉換(Hough transform),指定一些參數來說明我們想要檢測哪種線(即長線,短線,彎曲線,虛線,等等。)。
在此我們使用一個名為HoughLinesP的OpenCV函數,該函數需要幾個參數。讓我們編碼並在Canny函數中找到我們檢測到邊緣的圖像中的車道線。
下圖是我們要使用的圖像:
我們將使用它來查找圖像中的線,使用OpenCV函數HoughLinesP如下:
lines = cv2.HoughLinesP(masked_edges,rho,theta,threshold,np.array([]),
min_line_length,max_line_gap)
如上程式碼,針對Canny演算的輸出圖像masked_edges上進行操作,而HoughLinesP函數的輸出將是線,它將只是一個包含所有線段的端點(x1,y1,x2,y2)的陣列變換操作。其他參數定義了我們正在尋找的線段類型。
首先,rho和theta是我們在Hough空間中的網格的距離和角解析度。在霍夫空間中,我們有一個沿(Θ,ρ)軸佈置的網格。您需要以像素為單位指定rho,以弧度為單位指定theta。
如何決定合理的參數門檻?rho的最小值為1,θ的合理起始位置是1度(pi / 180弧度)。調整這些值可以更靈活地定義構成線的內容。
門檻值參數指定候選線需要進入輸出的最小投票數(給定網格單元中的交叉點)。空的np.array([])只是一個替代字符,無需更改它。 min_line_length是您將在輸出中接受的線的最小長度(以像素為單位),max_line_gap是您將允許連接到線的區段之間的最大距離(以像素為單位)。然後,您可以遞迴輸出線並將它們繪製到圖像上以查看所獲得的成果。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import cv2
image = mpimg.imread('exit-ramp.jpg')
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
kernel_size = 5
blur_gray = cv2.GaussianBlur(gray,(kernel_size,kernel_size),0)
low_threshold = 50
high_threshold = 150
masked_edges = cv2.Canny(blur_gray,low_threshold,high_threshold)
rho = 1
theta = np.pi/180
threshold = 1
min_line_length = 10
max_line_gap = 1
line_image = np.copy(image)*0 #creating a blank to draw lines on
lines = cv2.HoughLinesP(masked_edges,rho,theta,threshold,np.array([]),
min_line_length,max_line_gap)
for x1,y1,x2,y2 in line:
cv2.line(line_image,(X1,Y1),(X2,Y2),(255,0,0),10)
color_edges = np.dstack((masked_edges,masked_edges,masked_edges))
combo = cv2.addWeighted(color_edges, 0.8, line_image, 1, 0)
plt.imshow(combo)
至此,我已經檢測到很多線段!在這個實作練習中,重要的工作是確定哪些參數最適合優化車道線的檢測。然後,您將要應用感興趣區域掩碼來過濾掉圖像其他區域中檢測到的線段。之前使用三角形區域遮罩,未來將有機會使用cv2.fillPoly()函數使用四邊形區域遮罩(也可使用相同的方法來任意遮罩複雜的多邊形區域)
版主你好,我在練習時執行到第8步驟時,出現錯誤碼(ValueError: too many values to unpack (expected 4)),請問這個有什麼地發需要修改嗎?