iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 4
1
AI & Data

當自動駕駛遇見AI系列 第 4

Day4-當自動駕駛遇見AI-霍夫轉換(Hough transform)

目的

為完成尋找車道線的任務,接下來我們利用canny邊緣檢測圖像上再執行霍夫轉換(Hough transform),指定一些參數來說明我們想要檢測哪種線(即長線,短線,彎曲線,虛線,等等。)。

在此我們使用一個名為HoughLinesP的OpenCV函數,該函數需要幾個參數。讓我們編碼並在Canny函數中找到我們檢測到邊緣的圖像中的車道線。

下圖是我們要使用的圖像:

https://ithelp.ithome.com.tw/upload/images/20181019/201071431bpsxkNYvX.jpg

我們將使用它來查找圖像中的線,使用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是您將允許連接到線的區段之間的最大距離(以像素為單位)。然後,您可以遞迴輸出線並將它們繪製到圖像上以查看所獲得的成果。

程式執行流程及步驟

1.執行import 載入相關函式庫

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import cv2

2.讀入灰階圖像

image = mpimg.imread('exit-ramp.jpg')
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)

3.定義內核大小並應用高斯平滑處理

kernel_size = 5
blur_gray = cv2.GaussianBlur(gray,(kernel_size,kernel_size),0)

4.定義Canny的參數並應用

low_threshold = 50
high_threshold = 150
masked_edges = cv2.Canny(blur_gray,low_threshold,high_threshold)

5.定義Hough轉換參數

rho = 1
theta = np.pi/180
threshold = 1
min_line_length = 10
max_line_gap = 1

6.製作與我們的圖像大小相同的空白

line_image = np.copy(image)*0 #creating a blank to draw lines on

7.在邊緣檢測到的圖像上運行霍夫轉換

lines = cv2.HoughLinesP(masked_edges,rho,theta,threshold,np.array([]),
                            min_line_length,max_line_gap)

8.遞廻輸出“lines”並在空白處繪製線條

    for x1,y1,x2,y2 in line:
        cv2.line(line_image,(X1,Y1),(X2,Y2),(255,0,0),10)

9.創建彩色之二進制圖像與線圖像組合

color_edges = np.dstack((masked_edges,masked_edges,masked_edges))

10.在邊緣圖像上繪製線條

combo = cv2.addWeighted(color_edges, 0.8, line_image, 1, 0) 
plt.imshow(combo)

https://ithelp.ithome.com.tw/upload/images/20181019/201071431JUeLVwQS5.jpg

至此,我已經檢測到很多線段!在這個實作練習中,重要的工作是確定哪些參數最適合優化車道線的檢測。然後,您將要應用感興趣區域掩碼來過濾掉圖像其他區域中檢測到的線段。之前使用三角形區域遮罩,未來將有機會使用cv2.fillPoly()函數使用四邊形區域遮罩(也可使用相同的方法來任意遮罩複雜的多邊形區域)


上一篇
Day3-當自動駕駛遇見AI-Canny邊緣檢測(Canny edge detection)
下一篇
Day5-當自動駕駛遇見AI-Project1: Finding Lane Lines(1)
系列文
當自動駕駛遇見AI30

1 則留言

0
jacob0203
iT邦新手 5 級 ‧ 2020-04-26 15:41:16

版主你好,我在練習時執行到第8步驟時,出現錯誤碼(ValueError: too many values to unpack (expected 4)),請問這個有什麼地發需要修改嗎?https://ithelp.ithome.com.tw/upload/images/20200426/20126664rllXIBpZGj.png

我要留言

立即登入留言