文章目錄
- 1 前言
- 2 先上成果
- 3 車道線
- 4 問題抽象(建立模型)
- 5 幀掩碼(Frame Mask)
- 6 車道檢測的圖像預處理
- 7 圖像閾值化
- 8 霍夫線變換
- 9 實現車道檢測
- 9.1 幀掩碼創建
- 9.2 圖像預處理
- 9.2.1 圖像閾值化
- 9.2.2 霍夫線變換
- 最后
1 前言
🔥 優質競賽項目系列,今天要分享的是
🚩 機器視覺 深度學習 車道線檢測 - opencv
該項目較為新穎,適合作為競賽課題方向,學長非常推薦!
🥇學長這里給一個題目綜合評分(每項滿分5分)
- 難度系數:3分
- 工作量:3分
- 創新點:4分
🧿 更多資料, 項目分享:
https://gitee.com/dancheng-senior/postgraduate
2 先上成果
3 車道線
理解車道檢測的概念
那么什么是車道檢測?以下是百度百科對車道的定義:
車道,又稱行車線、車行道,是用在供車輛行經的道路。在一般公路和高速公路都有設置,高速公路對車道使用帶有法律上的規則,例如行車道和超車道。
對其進行定義是很重要的,因為它使我們能夠繼續進行車道檢測概念。我們在建立一個系統時不能有任何含糊不清的地方。
正如我前面提到的,車道檢測是自動駕駛汽車和自動駕駛汽車的關鍵組成部分。這是駕駛場景理解的重要研究課題之一。一旦獲得車道位置,車輛就知道去哪里,并避免撞上其他車道或離開道路。這樣可以防止駕駛員/車輛系統偏離車道。
以下是一些隨機道路圖像(第一行)及其檢測到的車道(第二行):
4 問題抽象(建立模型)
我們希望執行的任務是實時檢測視頻中的車道。我們可以通過多種方式進行車道檢測。我們可以使用基于學習的方法,例如在帶注釋的視頻數據集上訓練深度學習模型,或者使用預訓練好的模型。
然而,也有更簡單的方法來執行車道檢測。在這里,學長將向你展示如何在不使用任何深入學習模型的情況下完成此任務。
下面是將要處理的視頻的一個幀:
正如我們在這張圖片中看到的,我們有四條車道被白色的車道標線隔開。所以,要檢測車道,我們必須檢測車道兩邊的白色標記。這就引出了一個關鍵問題——我們如何檢測車道標線?
除了車道標線之外,場景中還有許多其他對象。道路上有車輛、路側護欄、路燈等,在視頻中,每一幀都會有場景變化。這很好地反映了真實的駕駛情況。
因此,在解決車道檢測問題之前,我們必須找到一種方法來忽略駕駛場景中不需要的對象。
我們現在能做的一件事就是縮小感興趣的領域。與其使用整個幀,不如只使用幀的一部分。在下面的圖像中,除了車道的標記之外,其他所有內容都隱藏了。當車輛移動時,車道標線將或多或少地落在該區域內:
5 幀掩碼(Frame Mask)
幀掩碼只是一個NumPy數組。
當我們想對圖像應用掩碼時,只需將圖像中所需區域的像素值更改為0、255或任何其他數字。
下面給出了一個圖像掩蔽的例子。圖像中某個區域的像素值已設置為0:
這是一種非常簡單但有效的從圖像中去除不需要的區域和對象的方法。
6 車道檢測的圖像預處理
我們將首先對輸入視頻中的所有幀應用掩碼。
然后,我們將應用圖像閾值化和霍夫線變換來檢測車道標線。
7 圖像閾值化
在這種方法中,灰度圖像的像素值根據閾值被指定為表示黑白顏色的兩個值之一。因此,如果一個像素的值大于一個閾值,它被賦予一個值,否則它被賦予另一個值。
如上所示,對蒙版圖像應用閾值后,我們只得到輸出圖像中的車道標線。現在我們可以通過霍夫線變換很容易地檢測出這些標記。
8 霍夫線變換
霍夫線變換是一種檢測任何可以用數學方法表示的形狀的方法。
例如,它可以檢測矩形、圓、三角形或直線等形狀。我們感興趣的是檢測可以表示為直線的車道標線。
在執行圖像閾值化后對圖像應用霍夫線變換將提供以下輸出:
9 實現車道檢測
是時候用Python實現這個車道檢測項目了!我推薦使用Google Colab,因為構建車道檢測系統需要計算能力。
首先導入所需的庫:
?
import os
import re
import cv2
import numpy as np
from tqdm import tqdm_notebook
import matplotlib.pyplot as plt
# 獲取幀的文件名
col_frames = os.listdir('frames/')
col_frames.sort(key=lambda f: int(re.sub('\D', '', f)))# 加載幀
col_images=[]
for i in tqdm_notebook(col_frames):img = cv2.imread('frames/'+i)col_images.append(img)
# 指定一個索引
idx = 457# plot frame
plt.figure(figsize=(10,10))
plt.imshow(col_images[idx][:,:,0], cmap= "gray")
plt.show()
9.1 幀掩碼創建
我們感興趣的區域是一個多邊形。我們想掩蓋除了這個區域以外的一切。因此,我們首先必須指定多邊形的坐標,然后使用它來準備幀掩碼:
9.2 圖像預處理
我們必須對視頻幀執行一些圖像預處理操作來檢測所需的車道。預處理操作包括:
-
圖像閾值化
-
霍夫線變換
9.2.1 圖像閾值化
9.2.2 霍夫線變換
?
lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)# 創建原始幀的副本
dmy = col_images[idx][:,:,0].copy()# 霍夫線
for line in lines:x1, y1, x2, y2 = line[0]cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3)# 畫出幀
plt.figure(figsize=(10,10))
plt.imshow(dmy, cmap= "gray")
plt.show()
最后
🧿 更多資料, 項目分享:
https://gitee.com/dancheng-senior/postgraduate