訂閱
糾錯(cuò)
加入自媒體

使用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鏈接:

image.png


       原文標(biāo)題 : 使用OpenCV的車輛檢測(cè)和計(jì)數(shù)系統(tǒng)

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)