使用OpenCV的車(chē)輛檢測(cè)和計(jì)數(shù)系統(tǒng)
概述
在本文中,我們將編寫(xiě)一個(gè)車(chē)輛計(jì)數(shù)和檢測(cè)系統(tǒng)。我們將使用OpenCV進(jìn)行所有圖像處理操作,并制作用于分類(lèi)汽車(chē)和公交車(chē)的 haar 級(jí)聯(lián)分類(lèi)器,還可以制作你自己的 haar 級(jí)聯(lián)分類(lèi)器。
范圍
1. 幫助交警:車(chē)輛檢測(cè)和計(jì)數(shù)系統(tǒng)對(duì)交警來(lái)說(shuō)是有益的,因?yàn)樗麄兛梢詮囊粋(gè)地方監(jiān)控的所有東西,只需要知道有多少車(chē)輛和哪些車(chē)輛通過(guò)了這個(gè)收費(fèi)站。
2. 維護(hù)記錄:由于車(chē)輛實(shí)時(shí)經(jīng)過(guò),因此某些人很難記錄所有車(chē)輛。這不像一個(gè)人正在觀看視頻,他們可以暫停它并對(duì)其進(jìn)行注釋?zhuā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)入所需的庫(kù)
# Import libraries
from PIL import Image
import cv2
import numpy as np
import requests
接下來(lái),我們將從互聯(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)
輸出:
接下來(lái),我們將應(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ù),我們嘗試用元素填充像素,也稱(chēng)為內(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)
使用汽車(chē)級(jí)聯(lián)檢測(cè)汽車(chē)
現(xiàn)在我們需要一個(gè)汽車(chē)級(jí)聯(lián)來(lái)檢測(cè)汽車(chē)。所以,我們首先需要將它們上傳到collab(如果你是在collab里做的),如果你是在本地機(jī)器里做的,那就把cascade文件添加到同一個(gè)文件夾中,并指定路徑 car_cascade_src。
這里我們將使用 CascadeClassifier 函數(shù),即 OpenCV 的預(yù)定義函數(shù),從預(yù)訓(xùn)練的 XML 文件(級(jí)聯(lián)文件 - 汽車(chē))中訓(xùn)練圖像。我們需要檢測(cè)多個(gè)對(duì)象,即汽車(chē),才能使用 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è)到的汽車(chē)周?chē)L制一個(gè)矩形。
在這里,我們將看到它將在檢測(cè)到的每輛車(chē)周?chē)鷦?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
公交車(chē)檢測(cè)
現(xiàn)在我們將使用另一個(gè)圖像,即公交車(chē)圖像,我們將從互聯(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è)谶@里處理公交車(chē)圖像,所以我們需要級(jí)聯(lián)來(lái)檢測(cè)公交車(chē)。我們將使用Bus_front 級(jí)聯(lián)從圖像中識(shí)別公交車(chē),我們將執(zhí)行與上述類(lèi)似的操作。
bus_cascade_src = 'Bus_front.xml'
bus_cascade = cv2.CascadeClassifier(bus_cascade_src)
bus = bus_cascade.detectMultiScale(grey2, 1.1, 1)
正如我們?cè)谄?chē)級(jí)聯(lián)中所做的類(lèi)似,我們將對(duì)公交車(chē)圖像執(zhí)行相同的輪廓操作,并在檢測(cè)到任何公交車(chē)時(shí)在公交車(chē)周?chē)鷦?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í)行車(chē)輛檢測(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)換為灰度,并使用汽車(chē)級(jí)聯(lián)來(lái)檢測(cè)該特定幀中的所有汽車(chē)。最后,我們使用 video.write() 方法編寫(xiě)這個(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)行汽車(chē)檢測(cè)和公交車(chē)檢測(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的車(chē)輛檢測(cè)和計(jì)數(shù)系統(tǒng)

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車(chē)電子技術(shù)在線大會(huì)
-
4月30日立即下載>> 【村田汽車(chē)】汽車(chē)E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書(shū)】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專(zhuān)題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開(kāi)始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類(lèi)新物種登上歷史舞臺(tái)
- 5 國(guó)產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來(lái)商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽(yáng)光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開(kāi)成長(zhǎng)空間
- 8 地平線自動(dòng)駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營(yíng)收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?