訂閱
糾錯
加入自媒體

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

image.png


       原文標題 : 使用OpenCV的車輛檢測和計數(shù)系統(tǒng)

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

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

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

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