使用OpenCV的車輛檢測和計數(shù)系統(tǒng)
概述
在本文中,我們將編寫一個車輛計數(shù)和檢測系統(tǒng)。我們將使用OpenCV進行所有圖像處理操作,并制作用于分類汽車和公交車的 haar 級聯(lián)分類器,還可以制作你自己的 haar 級聯(lián)分類器。
范圍
1. 幫助交警:車輛檢測和計數(shù)系統(tǒng)對交警來說是有益的,因為他們可以從一個地方監(jiān)控的所有東西,只需要知道有多少車輛和哪些車輛通過了這個收費站。
2. 維護記錄:由于車輛實時經(jīng)過,因此某些人很難記錄所有車輛。這不像一個人正在觀看視頻,他們可以暫停它并對其進行注釋,因此為了消除此限制,此應用程序可以非常熟練地以達到節(jié)省時間并實現(xiàn)自動化。
3. 交通監(jiān)控:由于此應用程序可以安裝在任何地方,因為它只需要一個攝像頭或一些電線(用于建立與中央系統(tǒng)的連接),因此如果某個地方的交通量很大,那么在該區(qū)域,員工可以對其進行監(jiān)控并將信息轉(zhuǎn)發(fā)給下一位收費員,以便他們提前做好準備。
導入所需的庫
# 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
輸出:
為了獲得更好的輸出,我們將對圖像進行一些轉(zhuǎn)換。在這里,我們將圖像轉(zhuǎn)換為灰度。
灰度
grey = cv2.cvtColor(image_arr,cv2.COLOR_BGR2GRAY)
Image.fromarray(grey)
輸出:
接下來,我們將應用高斯模糊去除圖像中的噪聲。
高斯模糊是圖像處理的技術之一。它也廣泛用于圖形設計,用于降低噪聲和平滑圖像,以便進行進一步的預處理,從而產(chǎn)生更好的輸出。
除了減少圖像中的噪聲,高斯模糊技術還減少了圖像的細節(jié)。為了應用這種預處理技術,我們將使用 GaussianBlur() 函數(shù)。
高斯模糊
blur = cv2.GaussianBlur(grey,(5,5),0)
Image.fromarray(blur)
輸出:
在這里,我們將應用圖像膨脹,膨脹是一種形態(tài)學技術,我們嘗試用元素填充像素,也稱為內(nèi)核(結構化塊),以在需要時填充圖像的缺失部分。
注意:它與腐蝕正好相反。膨脹
dilated = cv2.dilate(blur,np.ones((3,3)))
Image.fromarray(dilated)
輸出:
現(xiàn)在我們將使用內(nèi)核執(zhí)行形態(tài)學轉(zhuǎn)換。在這里,我們使用了一種Morphology-Ex技術,它告訴函數(shù)需要對其進行哪些圖像處理操作。
第二個參數(shù)是關于必須完成哪些操作,你 可能需要橢圓/圓形內(nèi)核。為了使用 OpenCV 實現(xiàn) Morphology-Ex 方法,我們將使用 getStructuringElement 方法。
Morphology-Ex,結構元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2, 2))
closing = cv2.morphologyEx(dilated, cv2.MORPH_CLOSE, kernel)
Image.fromarray(closing)
使用汽車級聯(lián)檢測汽車
現(xiàn)在我們需要一個汽車級聯(lián)來檢測汽車。所以,我們首先需要將它們上傳到collab(如果你是在collab里做的),如果你是在本地機器里做的,那就把cascade文件添加到同一個文件夾中,并指定路徑 car_cascade_src。
這里我們將使用 CascadeClassifier 函數(shù),即 OpenCV 的預定義函數(shù),從預訓練的 XML 文件(級聯(lián)文件 - 汽車)中訓練圖像。我們需要檢測多個對象,即汽車,才能使用 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)
我們將使用上面返回的輪廓并在檢測到的汽車周圍繪制一個矩形。
在這里,我們將看到它將在檢測到的每輛車周圍創(chuàng)建一個帶有紅色邊框的矩形。
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
公交車檢測
現(xiàn)在我們將使用另一個圖像,即公交車圖像,我們將從互聯(lián)網(wǎng)上獲取該圖像。我們將調(diào)整圖像大小,將其存儲為 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)
我們在這里處理公交車圖像,所以我們需要級聯(lián)來檢測公交車。我們將使用Bus_front 級聯(lián)從圖像中識別公交車,我們將執(zhí)行與上述類似的操作。
bus_cascade_src = 'Bus_front.xml'
bus_cascade = cv2.CascadeClassifier(bus_cascade_src)
bus = bus_cascade.detectMultiScale(grey2, 1.1, 1)
正如我們在汽車級聯(lián)中所做的類似,我們將對公交車圖像執(zhí)行相同的輪廓操作,并在檢測到任何公交車時在公交車周圍創(chuàng)建一個矩形。
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í)行車輛檢測和計數(shù)。
為了從幀或圖像創(chuàng)建輸出視頻, 我們需要 cv2.VideoWriter() 方法。它以帶擴展名的路徑作為第一個參數(shù);第二個參數(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)換為灰度,并使用汽車級聯(lián)來檢測該特定幀中的所有汽車。最后,我們使用 video.write() 方法編寫這個視頻,video.release() 將這個視頻保存到給定的路徑。
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()
結論
我們首先下載我們將要處理的圖像并執(zhí)行不同的操作。我們看到了如何使用用于物體檢測的 haar 級聯(lián),以及如何使用不同的 haar 級聯(lián)進行汽車檢測和公交車檢測。同樣,你可以使用許多預訓練的 haar 級聯(lián)進行其他對象檢測。
由于 haar 級聯(lián)用于對象檢測,因此我們的范圍很廣。它可用于對象檢測,我們還可以為特定對象創(chuàng)建自定義 haar 級聯(lián)。
尾注
這是這篇文章的repo鏈接:
原文標題 : 使用OpenCV的車輛檢測和計數(shù)系統(tǒng)
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
-
精彩回顧立即查看>> 【限時免費下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
-
5 夾縫中的文遠知行
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結構工程師 廣東省/深圳市