使用OpenCV的車輛檢測(cè)和計(jì)數(shù)系統(tǒng)
概述
在本文中,我們將編寫一個(gè)車輛計(jì)數(shù)和檢測(cè)系統(tǒng)。我們將使用OpenCV進(jìn)行所有圖像處理操作,并制作用于分類汽車和公交車的 haar 級(jí)聯(lián)分類器,還可以制作你自己的 haar 級(jí)聯(lián)分類器。
范圍
1. 幫助交警:車輛檢測(cè)和計(jì)數(shù)系統(tǒng)對(duì)交警來說是有益的,因?yàn)樗麄兛梢詮囊粋(gè)地方監(jiān)控的所有東西,只需要知道有多少車輛和哪些車輛通過了這個(gè)收費(fèi)站。
2. 維護(hù)記錄:由于車輛實(shí)時(shí)經(jīng)過,因此某些人很難記錄所有車輛。這不像一個(gè)人正在觀看視頻,他們可以暫停它并對(duì)其進(jìn)行注釋,因此為了消除此限制,此應(yīng)用程序可以非常熟練地以達(dá)到節(jié)省時(shí)間并實(shí)現(xiàn)自動(dòng)化。
3. 交通監(jiān)控:由于此應(yīng)用程序可以安裝在任何地方,因?yàn)樗恍枰粋(gè)攝像頭或一些電線(用于建立與中央系統(tǒng)的連接),因此如果某個(gè)地方的交通量很大,那么在該區(qū)域,員工可以對(duì)其進(jìn)行監(jiān)控并將信息轉(zhuǎn)發(fā)給下一位收費(fèi)員,以便他們提前做好準(zhǔn)備。
導(dǎo)入所需的庫
# Import libraries
from PIL import Image
import cv2
import numpy as np
import requests
接下來,我們將從互聯(lián)網(wǎng)上獲取圖像。然后我們將調(diào)整圖像大小并將其轉(zhuǎn)換為 NumPy 數(shù)組。
從 URL 讀取圖像
image = Image.open(requests.get('https://a57.foxnews.com/media.foxbusiness.com/BrightCove/854081161001/201805/2879/931/524/854081161001_5782482890001_5782477388001-vs.jpg', stream=True).raw)
image = image.resize((450,250))
image_arr = np.a(chǎn)rray(image)
image
輸出:
為了獲得更好的輸出,我們將對(duì)圖像進(jìn)行一些轉(zhuǎn)換。在這里,我們將圖像轉(zhuǎn)換為灰度。
灰度
grey = cv2.cvtColor(image_arr,cv2.COLOR_BGR2GRAY)
Image.fromarray(grey)
輸出:
接下來,我們將應(yīng)用高斯模糊去除圖像中的噪聲。
高斯模糊是圖像處理的技術(shù)之一。它也廣泛用于圖形設(shè)計(jì),用于降低噪聲和平滑圖像,以便進(jìn)行進(jìn)一步的預(yù)處理,從而產(chǎn)生更好的輸出。
除了減少圖像中的噪聲,高斯模糊技術(shù)還減少了圖像的細(xì)節(jié)。為了應(yīng)用這種預(yù)處理技術(shù),我們將使用 GaussianBlur() 函數(shù)。
高斯模糊
blur = cv2.GaussianBlur(grey,(5,5),0)
Image.fromarray(blur)
輸出:
在這里,我們將應(yīng)用圖像膨脹,膨脹是一種形態(tài)學(xué)技術(shù),我們嘗試用元素填充像素,也稱為內(nèi)核(結(jié)構(gòu)化塊),以在需要時(shí)填充圖像的缺失部分。
注意:它與腐蝕正好相反。膨脹
dilated = cv2.dilate(blur,np.ones((3,3)))
Image.fromarray(dilated)
輸出:
現(xiàn)在我們將使用內(nèi)核執(zhí)行形態(tài)學(xué)轉(zhuǎn)換。在這里,我們使用了一種Morphology-Ex技術(shù),它告訴函數(shù)需要對(duì)其進(jìn)行哪些圖像處理操作。
第二個(gè)參數(shù)是關(guān)于必須完成哪些操作,你 可能需要橢圓/圓形內(nèi)核。為了使用 OpenCV 實(shí)現(xiàn) Morphology-Ex 方法,我們將使用 getStructuringElement 方法。
Morphology-Ex,結(jié)構(gòu)元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2, 2))
closing = cv2.morphologyEx(dilated, cv2.MORPH_CLOSE, kernel)
Image.fromarray(closing)
使用汽車級(jí)聯(lián)檢測(cè)汽車
現(xiàn)在我們需要一個(gè)汽車級(jí)聯(lián)來檢測(cè)汽車。所以,我們首先需要將它們上傳到collab(如果你是在collab里做的),如果你是在本地機(jī)器里做的,那就把cascade文件添加到同一個(gè)文件夾中,并指定路徑 car_cascade_src。
這里我們將使用 CascadeClassifier 函數(shù),即 OpenCV 的預(yù)定義函數(shù),從預(yù)訓(xùn)練的 XML 文件(級(jí)聯(lián)文件 - 汽車)中訓(xùn)練圖像。我們需要檢測(cè)多個(gè)對(duì)象,即汽車,才能使用 detectMultiScale。
car_cascade_src = 'cars.xml'
car_cascade = cv2.CascadeClassifier(car_cascade_src)
cars = car_cascade.detectMultiScale(closing, 1.1, 1)
cars
輸出:
array([[376, 1, 22, 22],
[307, 4, 27, 27],
[196, 10, 28, 28],
[ 35, 2, 30, 30],
[150, 163, 68, 68],
[318, 121, 82, 82],
[101, 3, 43, 43],
[317, 66, 66, 66],
[274, 20, 38, 38],
[256, 52, 79, 79],
[245, 24, 20, 20],
[250, 35, 25, 25],
[ 63, 40, 22, 22],
[209, 88, 54, 54],
[ 13, 25, 43, 43],
[384, 84, 59, 59],
[145, 91, 53, 53],
[ 52, 44, 39, 39],
[237, 38, 49, 49],
[362, 43, 46, 46],
[268, 106, 60, 60]], dtype=int32)
我們將使用上面返回的輪廓并在檢測(cè)到的汽車周圍繪制一個(gè)矩形。
在這里,我們將看到它將在檢測(cè)到的每輛車周圍創(chuàng)建一個(gè)帶有紅色邊框的矩形。
cnt = 0
for (x,y,w,h) in cars:
cv2.rectangle(image_arr,(x,y),(x+w,y+h),(255,0,0),2)
cnt += 1
print(cnt, " cars found")
Image.fromarray(image_arr)
輸出:
21 cars found
公交車檢測(cè)
現(xiàn)在我們將使用另一個(gè)圖像,即公交車圖像,我們將從互聯(lián)網(wǎng)上獲取該圖像。我們將調(diào)整圖像大小,將其存儲(chǔ)為 NumPy 數(shù)組,并將其轉(zhuǎn)換為灰度。
# Reading image form url
image2 = Image.open(requests.get('https://qph.fs.quoracdn.net/main-qimg-b5c4e39dcd48dddd9e609e6022f74d85', stream=True).raw)
image2 = image2.resize((450,250))
image_arr2 = np.a(chǎn)rray(image2)
grey2 = cv2.cvtColor(image_arr2,cv2.COLOR_BGR2GRAY)
我們?cè)谶@里處理公交車圖像,所以我們需要級(jí)聯(lián)來檢測(cè)公交車。我們將使用Bus_front 級(jí)聯(lián)從圖像中識(shí)別公交車,我們將執(zhí)行與上述類似的操作。
bus_cascade_src = 'Bus_front.xml'
bus_cascade = cv2.CascadeClassifier(bus_cascade_src)
bus = bus_cascade.detectMultiScale(grey2, 1.1, 1)
正如我們?cè)谄嚰?jí)聯(lián)中所做的類似,我們將對(duì)公交車圖像執(zhí)行相同的輪廓操作,并在檢測(cè)到任何公交車時(shí)在公交車周圍創(chuàng)建一個(gè)矩形。
cnt = 0
for (x,y,w,h) in bus:
cv2.rectangle(image_arr2,(x,y),(x+w,y+h),(255,0,0),2)
cnt += 1
print(cnt, " bus's found")
Image.fromarray(image_arr2)
輸出:
1 bus's found
現(xiàn)在我們將在視頻中執(zhí)行車輛檢測(cè)和計(jì)數(shù)。
為了從幀或圖像創(chuàng)建輸出視頻, 我們需要 cv2.VideoWriter() 方法。它以帶擴(kuò)展名的路徑作為第一個(gè)參數(shù);第二個(gè)參數(shù)是輸出格式的編解碼器,還需要傳遞每秒幀數(shù)和高度和寬度。
cascade_src = 'cars.xml'
video_src = 'Cars.mp4'
cap = cv2.VideoCapture(video_src)
car_cascade = cv2.CascadeClassifier(cascade_src)
video = cv2.VideoWriter('result.a(chǎn)vi',cv2.VideoWriter_fourcc(*'DIVX'), 15, (450,250))
現(xiàn)在我們將從輸入視頻中一一讀取幀,將它們轉(zhuǎn)換為灰度,并使用汽車級(jí)聯(lián)來檢測(cè)該特定幀中的所有汽車。最后,我們使用 video.write() 方法編寫這個(gè)視頻,video.release() 將這個(gè)視頻保存到給定的路徑。
while True:
ret, img = cap.read()
if (type(img) == type(None)):
break
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cars = car_cascade.detectMultiScale(gray, 1.1, 2)
for (x,y,w,h) in cars:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
video.write(img)
video.release()
結(jié)論
我們首先下載我們將要處理的圖像并執(zhí)行不同的操作。我們看到了如何使用用于物體檢測(cè)的 haar 級(jí)聯(lián),以及如何使用不同的 haar 級(jí)聯(lián)進(jìn)行汽車檢測(cè)和公交車檢測(cè)。同樣,你可以使用許多預(yù)訓(xùn)練的 haar 級(jí)聯(lián)進(jìn)行其他對(duì)象檢測(cè)。
由于 haar 級(jí)聯(lián)用于對(duì)象檢測(cè),因此我們的范圍很廣。它可用于對(duì)象檢測(cè),我們還可以為特定對(duì)象創(chuàng)建自定義 haar 級(jí)聯(lián)。
尾注
這是這篇文章的repo鏈接:
原文標(biāo)題 : 使用OpenCV的車輛檢測(cè)和計(jì)數(shù)系統(tǒng)
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題
- 1 【一周車話】沒有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無人駕駛車,還未迎來“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 6 馬斯克致敬“國產(chǎn)蘿卜”?
- 7 神經(jīng)網(wǎng)絡(luò),誰是盈利最強(qiáng)企業(yè)?
- 8 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 9 諾獎(jiǎng)進(jìn)入“AI時(shí)代”,人類何去何從?
- 10 Open AI融資后成萬億獨(dú)角獸,AI人才之爭開啟
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市