挑戰杯 基于機器視覺的車道線檢測

文章目錄

  • 1 前言
  • 2 先上成果
  • 3 車道線
  • 4 問題抽象(建立模型)
  • 5 幀掩碼(Frame Mask)
  • 6 車道檢測的圖像預處理
  • 7 圖像閾值化
  • 8 霍夫線變換
  • 9 實現車道檢測
    • 9.1 幀掩碼創建
    • 9.2 圖像預處理
      • 9.2.1 圖像閾值化
      • 9.2.2 霍夫線變換
  • 最后

1 前言

🔥 優質競賽項目系列,今天要分享的是

基于深度學習的視頻多目標跟蹤實現

該項目較為新穎,適合作為競賽課題方向,學長非常推薦!

🧿 更多資料, 項目分享:

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714614.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714614.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

范偉:你們怎么老提1,200呢,有什么典故啊?趙本山:沒有啊!

范偉:你們怎么老提1,200呢,有什么典故啊?趙本山:沒有啊! --小品《面子》(中3)的臺詞 表演者:趙本山 高秀敏 范偉 (接上) 范偉:哎吃啊 趙:哎呀這電視看的挺…

Acwing枚舉、模擬與排序(一)

連號區間數 原題鏈接:https://www.acwing.com/problem/content/1212/ 初始最小值和最大值的依據是題目給出的數據范圍。只要在數據范圍之外就可以。 連號的時候,相鄰元素元素之間,差值為1。那么區間右邊界和左邊界,的值的差&#…

cAdvisor+Prometheus+Grafana 搞定Docker容器監控平臺

cAdvisorPrometheusGrafana cAdvisorPrometheusGrafana 搞定Docker容器監控平臺1、先給虛擬機上傳cadvisor2、What is Prometheus?2.1、架構圖 3、利用docker安裝普羅米修斯4、安裝grafana cAdvisorPrometheusGrafana 搞定Docker容器監控平臺 1、先給虛擬機上傳cadvisor cAd…

MySQL事務和鎖機制

MySQL技術——事務和鎖機制 一、事務(1)概述(2)ACID特性(3)事務并發存在的問題(4)事務的隔離級別 二、鎖機制(1)鎖的力度(2)表的分類&…

網絡編程-編碼與解碼(Protobuf)

編碼與解碼 下面的文字都來自于極客時間 為什么要編解碼呢?因為計算機數據傳輸的是二進制的字節數據 解碼:字節數據 --> 字符串(字符數據) 編碼:字符串(字符數據)–> 字節數據 我們在編…

Python 實現海康機器人工業相機 MV-CS050-10GC 的實時顯示視頻流及拍照功能(實時顯示視頻流同時可以進行拍照)

參考鏈接: https://www.cnblogs.com/HanYork/p/17388506.html https://www.cnblogs.com/miracle-luna/p/16960556.html#5138211 Flask搭建流媒體服務器:使用Flask搭建一個流媒體服務器_multipart/x-mixed-replace; boundaryframe-CSDN博客

公共字段自動填充

在開發中經常面臨對于一些公共字段的賦值。 如在下表中: 如何讓程序自動為我們需要賦值的公共字段進行賦值,避免在業務代碼中重復寫這些公共字段的賦值代碼 如下圖所示: 實現思路: 1.自定義注解AutoFill,用于標識需…

linux環境安裝cuda toolkit

1 全新安裝 如果環境中沒安裝過cuda版本, 這種情況下比較簡單。 直接在https://developer.nvidia.com/cuda-toolkit-archive選擇對應版本下載安裝即可。 如下為安裝cuda toolkit 11.8. 2 環境中已經存在其他版本 這種情況下比較復雜一些。 首先要確認最高支持的…

李沐動手學習深度學習——4.2練習

1. 在所有其他參數保持不變的情況下,更改超參數num_hiddens的值,并查看此超參數的變化對結果有何影響。確定此超參數的最佳值。 通過改變隱藏層的數量,導致就是函數擬合復雜度下降,隱藏層過多可能導致過擬合,而過少導…

Git多人合作的推送流程

多人合作時,使用Git進行代碼推動(push)需要一定的協調和規范,以確保代碼庫的整體健康。以下是一個常見的多人合作時的Git代碼推動流程: 同步主分支: 在推送之前,確保你的本地主分支(…

【Java】四大函數式接口

消費型接口Consumer 消費型接口接收一個輸入,沒有返回值 在stream流計算中 forEach() 接收一個消費型接口Consumer用于 遍歷元素 /*** 消費型接口* 接收一個輸入,沒有返回值*/ public class demo01 {public static void main(String[] args) {//TODO 消…

【MySQL】表的內連和外連(重點)

表的連接分為內連和外連。 一、內連接 內連接實際上就是利用 where 子句對兩種表形成的笛卡兒積進行篩選,前面學習的查詢都是內連接,也是在開發過程中使用的最多的連接查詢。 select 字段 from 表1 inner join 表2 on 連接條件 and 其他條件; 注意&…

【數倉】Hadoop集群配置常用參數說明

Hadoop集群中,需要配置的文件主要包括四個 配置核心Hadoop參數: 編輯core-site.xml文件,設置Hadoop集群的基本參數,如文件系統、Hadoop臨時目錄等。 配置HDFS參數: 編輯hdfs-site.xml文件,設置HDFS的相關參…

策略開發:EMA如何計算

EMA的計算原理 EMA 是MA(平滑移動平均線)的另一種形式。全名“加權指數移動平均線”。 2/13就是12日移動平均線的平滑因子,他的意思是指:給予新價格 2/13的權重,給予過去的EMA 11/13的權重。 在計算的時候第一天的M…

Linux使用基礎命令

1.常用系統工作命令 (1).用echo命令查看SHELL變量的值 qiangziqiangzi-virtual-machine:~$ echo $SHELL /bin/bash(2).查看本機主機名 qiangziqiangzi-virtual-machine:~$ echo $HOSTNAME qiangzi-virtual-machine (3).date命令用于顯示/設置系統的時間或日期 qiangziqian…

Linux多線程服務端編程:使用muduo C++網絡庫 學習筆記 附錄B 從《C++ Primer(第4版)》入手學習C++

這是作者為《C Primer(第4版)(評注版)》寫的序言,文中“本書”指的是這本書評注版。 B.1 為什么要學習C 2009年本書作者Stanley Lippman先生應邀來華參加上海祝成科技舉辦的C技術大會,他表示人們現在還用…

MySQL存儲過程和Function

一、存儲過程 MySQL中提供存儲過程和存儲函數機制,將其統稱為存儲程序。 SQL語句要先編譯,然后執行,存儲程序是一組為了完成特定功能的SQL語句,編譯后存到數據庫中。 用戶通過指定存儲程序的名字并給定參數來調用才會執行。 存…

擴展學習|大數據分析的現狀和分類

文獻來源:[1] Mohamed A , Najafabadi M K , Wah Y B ,et al.The state of the art and taxonomy of big data analytics: view from new big data framework[J].Artificial Intelligence Review: An International Science and Engineering Journal, 2020(2):53. 下…

藍橋杯(3.2)

1209. 帶分數 import java.io.*;public class Main {static BufferedReader br new BufferedReader(new InputStreamReader(System.in));static PrintWriter pw new PrintWriter(new OutputStreamWriter(System.out));static final int N 10;static int n, cnt;static int[…

LabVIEW流量控制系統

LabVIEW流量控制系統 為響應水下航行體操縱舵翼環量控制技術的試驗研究需求,通過LabVIEW開發了一套小量程流量控制系統。該系統能夠滿足特定流量控制范圍及精度要求,展現了其在實驗研究中的經濟性、可靠性和實用性,具有良好的推廣價值。 項…