使用 OpenCV 和 Python 進行車道檢測和物體檢測(YOLO)

本項目旨在開發一個集車道檢測與物體檢測功能于一體的智能視覺分析系統,利用先進的計算機視覺技術和深度學習模型,實現實時的道路場景理解和目標識別。系統主要依托OpenCV這一強大的計算機視覺庫,以及Python作為編程語言,融合了車道檢測算法和YOLO(You Only Look Once)物體檢測算法,以期達到高效、精準的視覺分析效果。

1. 車道檢測

車道檢測部分主要采用基于圖像處理的技術,具體步驟包括:

  • 預處理:對輸入的圖像進行灰度化、高斯模糊、Canny邊緣檢測等操作,以增強圖像的對比度和減少噪聲干擾。

  • 興趣區域提取:通過多邊形掩模,只保留包含車道線的區域,忽略無關背景。

  • 霍夫變換:利用霍夫直線變換檢測車道線,將邊緣圖像轉換到參數空間,尋找直線的參數。

  • 后處理:對檢測到的車道線進行擬合和平滑,確保車道線的連續性和準確性。

2. 物體檢測(YOLO)

YOLO算法是一種實時的目標檢測框架,其核心特點是在一次前向傳播中同時預測物體的位置和類別,大幅提高了檢測速度。本項目中,我們采用YOLOv4或YOLOv5作為基礎模型,針對特定場景進行微調和優化,以提高檢測精度和泛化能力。

實現流程

  1. 數據準備:收集大量的道路場景圖像和視頻,包括不同天氣、光照條件下的樣本,進行標注,構建訓練數據集。

  2. 模型訓練:使用標注好的數據集,訓練車道檢測模型和YOLO模型,調整超參數,優化模型性能。

  3. 系統集成:將車道檢測和物體檢測兩個子系統整合到一起,設計合理的輸入輸出接口,確保兩者的無縫協作。

  4. 測試與評估:在多種場景下測試系統性能,包括但不限于城市街道、高速公路、夜間環境等,評估檢測精度、實時性和穩定性。

  5. 部署與優化:根據實際應用需求,將系統部署到目標平臺,如自動駕駛車輛、監控系統等,并持續收集反饋,進行迭代優化。

應用前景

本項目成果可廣泛應用于智能交通、自動駕駛、安防監控等領域,為實現更加安全、高效的交通系統提供技術支持。例如,在自動駕駛車輛中,車道檢測與物體檢測的結合可以幫助車輛實時理解周圍環境,做出準確的決策;在城市監控系統中,則能輔助警察和安保人員快速識別異常情況,提升公共安全水平。

結語

通過融合車道檢測與物體檢測兩大核心技術,本項目致力于打造一個全面、智能的視覺分析系統,推動計算機視覺技術在實際應用中的創新與發展。

關鍵代碼部分

import numpy as np
import cv2
from utils import *
import os
import time
import argparseparser = argparse.ArgumentParser()
parser.add_argument('--model_cfg', type = str, default = '',help = 'Path to config file')
parser.add_argument('--model_weights', type=str,default='',help='path to weights of model')
parser.add_argument('--video', type=str, default='',help='path to video file')
parser.add_argument('--src', type=int, default=0,help='source of the camera')
parser.add_argument('--output_dir', type=str, default='',help='path to the output directory')
args = parser.parse_args()# print the arguments
print('----- info -----')
print('[i] The config file: ', args.model_cfg)
print('[i] The weights of model file: ', args.model_weights)
print('[i] Path to video file: ', args.video)
print('###########################################################\n')
frameWidth= 640
frameHeight = 480net = cv2.dnn.readNet(args.model_weights, args.model_cfg)
classes = []
with open("coco.names", "r") as f:classes = [line.strip() for line in f.readlines()] # we put the names in to an arraylayers_names = net.getLayerNames()
output_layers = [layers_names[i[0] -1] for i in net.getUnconnectedOutLayers()]
colors = np.random.uniform(0, 255, size = (len(classes), 3))font = cv2.FONT_HERSHEY_PLAIN
frame_id = 0
cameraFeed= False
#videoPath = 'road_car_view.mp4'
cameraNo= 1
#frameWidth= 640
#frameHeight = 480if cameraFeed:intialTracbarVals = [24,55,12,100] #  #wT,hT,wB,hB
else:intialTracbarVals = [42,63,14,87]   #wT,hT,wB,hBoutput_file = ''
if cameraFeed:cap = cv2.VideoCapture(cameraNo)cap.set(3, frameWidth)cap.set(4, frameHeight)
else:cap = cv2.VideoCapture(args.video)output_file = args.video[:-4].rsplit('/')[-1] + '_Detection.avi'
count=0
noOfArrayValues =10
#global arrayCurve, arrayCounter
arrayCounter=0
arrayCurve = np.zeros([noOfArrayValues])
myVals=[]
initializeTrackbars(intialTracbarVals)#fourcc = cv2.VideoWriter_fourcc(*'XVID')
#video_writer = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))
video_writer = cv2.VideoWriter('output2.avi', cv2.VideoWriter_fourcc(*'XVID'), cap.get(cv2.CAP_PROP_FPS), (2 * frameWidth,frameHeight))
starting_time = time.time()
while True:success, img = cap.read()if not success:print('[i] ==> Done processing!!!')print('[i] ==> Output file is stored at', os.path.join(args.output_dir, output_file))cv2.waitKey(1000)break#img = cv2.imread('test3.jpg')if cameraFeed== False:img = cv2.resize(img, (frameWidth, frameHeight), None)imgWarpPoints = img.copy()imgFinal = img.copy()imgCanny = img.copy()imgUndis = undistort(img)imgThres,imgCanny,imgColor = thresholding(imgUndis)src = valTrackbars()imgWarp = perspective_warp(imgThres, dst_size=(frameWidth, frameHeight), src=src)imgWarpPoints = drawPoints(imgWarpPoints, src)imgSliding, curves, lanes, ploty = sliding_window(imgWarp, draw_windows=True)try:curverad =get_curve(imgFinal, curves[0], curves[1])lane_curve = np.mean([curverad[0], curverad[1]])imgFinal = draw_lanes(img, curves[0], curves[1],frameWidth,frameHeight,src=src)# AveragecurrentCurve = lane_curve // 50if  int(np.sum(arrayCurve)) == 0:averageCurve = currentCurveelse:averageCurve = np.sum(arrayCurve) // arrayCurve.shape[0]if abs(averageCurve-currentCurve) >200: arrayCurve[arrayCounter] = averageCurveelse :arrayCurve[arrayCounter] = currentCurvearrayCounter +=1if arrayCounter >=noOfArrayValues : arrayCounter=0cv2.putText(imgFinal, str(int(averageCurve)), (frameWidth//2-70, 70), cv2.FONT_HERSHEY_DUPLEX, 1.75, (0, 0, 255), 2, cv2.LINE_AA)except:lane_curve=00passimgFinal= drawLines(imgFinal,lane_curve)# Object detection success, frame = cap.read()frame = cv2.resize(frame, (frameWidth, frameHeight), None)frame_id += 1height, width, channels = frame.shape# Detect imageblob = cv2.dnn.blobFromImage(frame, 0.00392, (320, 320), (0,0,0), swapRB = True, crop = False)net.setInput(blob)start = time.time()outs = net.forward(output_layers)# Showing informations on the screenclass_ids = []confidences = []boxes = []for out in outs:for detection in out:scores = detection[5:]class_id = np.argmax(scores)confidence = scores[class_id]if confidence > 0.5:#Object detectedcenter_x = int(detection[0] * width)center_y = int(detection[1] * height)w = int(detection[2] * width)h = int(detection[3] * height)# Rectangle coordinatesx = int(center_x - w / 2)y = int(center_y -h / 2)#cv2.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0))boxes.append([x, y, w, h])confidences.append(float(confidence))# Name of the objectclass_ids.append(class_id)indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.3)for i in range(len(boxes)):if i in indexes:x, y, w, h = boxes[i]label = "{}: {:.2f}%".format(classes[class_ids[i]], confidences[i]*100)color = colors[i]cv2.rectangle(frame, (x,y), (x+w, y+h), color, 2)cv2.putText(frame, label, (x,y+10), font, 2, color, 2)elapsed_time = time.time() - starting_timefps = frame_id / elapsed_timecv2.putText(frame, "FPS:" + str(fps), (10,30), font, 2, (0, 0, 0), 1)imgBlank = np.zeros_like(img)imgStacked = stackImages(0.7, ([imgUndis,frame],[imgColor, imgCanny],[imgWarp,imgSliding]))#final_frame = cv2.hconcat((frame,imgCanny))#video_writer.write(final_frame)#cv2.imshow('frame',final_frame)cv2.imshow("Image", frame)cv2.imshow("PipeLine",imgStacked)cv2.imshow("Result", imgFinal)

識別道路邊界的過程,即道路檢測管道,主要包括以下步驟:

  1. 相機校準矩陣計算:首先,使用OpenCV庫中的cv2.findChessboardCorners()函數計算相機的校準矩陣,以消除由鏡頭產生的畸變。這一校準步驟確保了車道檢測算法能夠適應不同類型的相機,提高算法的通用性。校準后,將校準矩陣應用于原始圖像,進行畸變校正。

  2. 圖像邊緣檢測與閾值處理:接著,通過一組基于梯度和顏色的閾值處理技術,使用cv2.Sobelcv2.cvtColor函數檢測圖像中的邊緣,生成二值化的邊緣圖像。這一步驟有助于突出圖像中的車道線條,為后續的車道邊界識別奠定基礎。

  3. 透視變換:為了更方便地提取車道邊界,接下來會對處理后的圖像進行透視變換,將其轉換為鳥瞰視角。這種變換使得車道邊界在圖像中呈現出更為直觀和易于識別的形式。

  4. 車道像素掃描與擬合:在鳥瞰圖的基礎上,系統會掃描整個圖像,尋找屬于車道邊界的像素點。找到足夠的像素點后,通過曲線擬合算法將它們擬合成車道邊界。之后,再將檢測到的車道邊界反向映射回原始圖像中,實現車道的可視化標識。

  5. 道路屬性估算:最后,系統還會估算一些重要的道路屬性,比如道路的曲率以及車輛在車道內的相對位置。這些信息對于自動駕駛車輛來說至關重要,能夠幫助車輛更好地理解自身在道路上的位置和方向。

整個過程的快照可以這樣描述:從原始圖像開始,經過一系列精心設計的圖像處理步驟,最終在圖像中標記出清晰的車道邊界,并提供關于道路狀況的關鍵信息。這一系列操作構成了一個高效、準確的道路邊界識別系統,是實現自動駕駛和智能交通系統的重要組成部分。

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

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

相關文章

MySQL索引教程(01):創建索引

文章目錄 MySQL 創建索引索引介紹MySQL CREATE INDEX 語法MySQL 索引類型MySQL CREATE INDEX 實例結論 MySQL 創建索引 對于一個具有大量數據行的表,如果你根據某個查詢條件檢索數據時很慢,可能是因為你沒有在檢索條件相關的列上創建索引。 索引類似于…

FPC生產工藝全流程詳解

FPC生產制作繁瑣而且難度較大,與普通PCB比較,FPC單位面積電路的造價高很多,但是,由于FPC優異的柔性、輕薄和可靠性等特性,給眾多領域的設備和產品提供了更廣泛的實現空間和新的設計方案,比如沉金板在電子、…

android的activty冷啟動和熱啟動差異是什么?

Android的Activity冷啟動和熱啟動之間存在顯著差異,這些差異主要體現在啟動過程、資源加載、組件初始化以及用戶體驗等方面。以下是對兩者差異的詳細分析: 一、定義與過程差異 冷啟動: 定義:冷啟動是指應用程序完全退出后&#…

Java需要英語基礎嗎?

Java編程語言本身并不要求必須有很強的英語基礎,因為Java的語法和邏輯是獨立于任何特定語言的。我收集歸類了一份嵌入式學習包,對于新手而言簡直不要太棒,里面包括了新手各個時期的學習方向編程教學、問題視頻講解、畢設800套和語言類教學&am…

android開發引入jar包

我在為一個安卓設備開發一個APP,設備的廠家給我提供了一個jar包,我應該如何把它引入到項目之中呢? 很慚愧我以前幾乎沒做過android的開發,在此之前這么一個簡單的問題也不會。 實踐 我隨手在Android studio中新建了一個項目。 你…

Java項目:基于SSM框架實現的共享客棧管理系統分前后臺【ssm+B/S架構+源碼+數據庫+畢業論文】

一、項目簡介 本項目是一套基于SSM框架實現的共享客棧管理系統 包含:項目源碼、數據庫腳本等,該項目附帶全部源碼可作為畢設使用。 項目都經過嚴格調試,eclipse或者idea 確保可以運行! 該系統功能完善、界面美觀、操作簡單、功能…

Splunk Enterprise for Windows 未授權任意文件讀取漏洞復現(CVE-2024-36991)

0x01 產品簡介 Splunk Enterprise是一款功能強大的數據分析引擎,旨在從所有IT系統和基礎設施數據中提供數據搜索、報表和可視化展現。Splunk Enterprise能夠收集、索引和利用所有應用程序、服務器和設備(包括物理、虛擬和云中環境)生成的快速移動型計算機數據。它允許用戶從…

交易積累-比特幣

在某些情況下,由于監管限制或個人選擇,投資者可能會考慮購買與比特幣相關的替代投資產品,如比特幣礦業公司股票(例如Marathon Digital Holdings, Inc.,股票代碼:MARA)或加密貨幣交易平臺的股票&…

使用maven搭建一個SpingBoot項目

1.首先創建一個maven項目 注意選擇合適的jdk版本 2.添加依賴 2.在pom.xml中至少添加依賴 spring-boot-starter-web 依賴&#xff0c;目的是引入Tomcat&#xff0c;以及SpringMVC等&#xff0c;使項目具有web功能。 <!-- 引入 包含tomcat&#xff0c;SpringMVC&#xff0c…

【C++題解】1561. 買木頭

問題&#xff1a;1561. 買木頭 類型&#xff1a;省賽、數組問題、二分答案、貪心、2015江蘇省青少年信息學奧林匹克競賽復賽 題目描述&#xff1a; 有 n 個木材供應商&#xff0c;每個供貨商有長度相同一定數量的木頭。長木頭可以鋸短&#xff0c;但短木頭不能接長。有一個客…

web前端之上傳文件夾、webkitdirectory

MENU 前言element-ui寫法input寫法 前言 1、以下代碼只實現的單個文件夾的上傳&#xff0c;原本需求是實現選擇多個文件夾上傳&#xff0c;但是沒找到實現的方法。如果想實現多個文件夾上傳&#xff0c;可以給這些文件夾新建一個父級文件夾&#xff0c;點擊上傳的時候選擇父級文…

14-36 劍和詩人10 - 用LLM構建 AI 代理平臺

介紹 在當今快速發展的技術環境中&#xff0c;大型語言模型 (LLM) 和 AI 代理正在改變我們與信息交互、實現流程自動化以及應對不同行業復雜挑戰的方式。隨著這些強大的模型不斷發展&#xff0c;對能夠無縫集成和協調它們的強大平臺的需求變得越來越重要。 讓我們深入研究設計…

android2024 gradle8 Processor和ksp兩種編譯時注解實現

android編譯時注解&#xff0c;老生常談&#xff0c;外面的例子都是bindView&#xff0c;腦殼看疼了&#xff0c;自己學習和編寫下。 而且現在已經進化到kotlin2.0&#xff0c;google也逐漸放棄kapt&#xff0c;進入維護狀態。所以要好好看看本貼。 參考我的工程&#xff1a; h…

數據結構之算法的時間復雜度

1.時間復雜度的定義 在計算機科學中&#xff0c;算法的時間復雜度是一個函數&#xff0c;它定量描述了算法的運行時間。一個算法所花費的時間與其中語句的執行次數成正比列&#xff0c;算法中的基本操作的執行次數&#xff0c;為算法的時間復雜度 例1&#xff1a; 計算Func1…

Linux:ollama大模型部署

目錄 Ollama 是一個能在本地機器上輕松構建和運行大型語言模型的輕量級、可擴展框架&#xff0c;適用于多種場景&#xff0c;具有易于使用、資源占用少、可擴展性強等特點。 1.安裝下載ollama 2.為 Ollama 創建一個用戶 3.為ollama創建服務文件 4.啟動ollama服務 5.拉取語…

Java 家庭物聯網

家庭物聯網系統的代碼和說明&#xff0c;包括用戶認證、設備控制、數據監控、通知和警報、日志記錄以及WebSocket實時更新功能。 ### 項目結構 plaintext home-iot-system ├── backend │ └── src │ └── main │ └── java │ └…

圖書館數據倉庫

目錄 1.數據倉庫的數據來源為業務數據庫&#xff08;mysql&#xff09; 初始化腳本 init_book_result.sql 2.通過sqoop將mysql中的業務數據導入到大數據平臺&#xff08;hive&#xff09; 導入mysql數據到hive中 3.通過hive進行數據計算和數據分析 形成數據報表 4.再通過sq…

【matlab】智能優化算法——求解目標函數

智能優化算法在求解目標函數方面發揮著重要作用&#xff0c;它通過迭代、篩選等方法來尋找目標函數的最優值&#xff08;極值&#xff09;。以下是關于智能優化算法求解目標函數的詳細介紹&#xff1a; 一、智能優化算法概述 智能優化算法是一種搜索算法&#xff0c;旨在通過…

設置單實例Apache HTTP服務器

配置倉庫 [rootlocalhost ~]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# vi rpm.repo倉庫代碼&#xff1a; [BaseOS] nameBaseOS baseurl/mnt/BaseOS enabled1 gpgcheck0[AppStream] nameAppStream baseurl/mnt/AppStream enabled1 gpgcheck0掛載 [rootlocalhost …

2.4G無線收發芯片 XL2401D,SOP16封裝,集成單片機,高性價比

XL2401D 芯片是工作在2.400~2.483GHz世界通用ISM頻段&#xff0c;片內集成了九齊 NY8A054E單片機的SOC無線收發芯片。芯片集成射頻收發機、頻率收生器、晶體振蕩器、調制解調器等功能模塊&#xff0c;并且支持一對多組網和帶ACK的通信模式。發射輸出功率、工作頻道以及通信數據…