在本文中,将探讨如何开发一个能够处理图像和视频的车辆检测与计数系统。将使用OpenCV库来执行所有的图像处理操作,并使用Haar级联分类器来识别和计数车辆和公交车。
该系统对于交通警察来说非常有用,因为它可以从一个单一的监控点监控多个交通情况,例如有多少车辆通过了收费站,以及具体是哪些车辆。此外,该系统还可以帮助维护交通记录,这对于实时通过的车辆来说是一项挑战,因为它们是连续不断的。通过自动化,该应用可以节省时间并提高效率。
交通监控控制:由于该应用只需要一个摄像头或一些连接到中央系统的电线,因此可以在任何地方安装。如果某个区域的交通量很大,那么从该区域的官员可以监控并提前通知下一个收费站的官员,以便他们做好准备。
from PIL import Image
import cv2
import numpy as np
import requests
接下来,将从互联网上获取图像,并对其进行缩放和转换为NumPy数组。
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.array(image)
为了获得更好的输出结果,将对图像进行一些转换。首先,将图像转换为灰度图。
grey = cv2.cvtColor(image_arr, cv2.COLOR_BGR2GRAY)
接下来,将应用高斯模糊来减少图像中的噪声。
blur = cv2.GaussianBlur(grey, (5,5), 0)
高斯模糊是一种图像处理技术,它被广泛用于图形设计中,用于减少噪声和平滑图像,以便在后续的预处理中获得更好的输出。
dilated = cv2.dilate(blur, np.ones((3,3)))
现在,将执行形态学变换,使用形态学-Ex技术,这是一种告诉需要对哪些图像处理操作进行操作的技术。
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2, 2))
closing = cv2.morphologyEx(dilated, cv2.MORPH_CLOSE, kernel)
现在需要一个车辆级联来检测车辆。将使用OpenCV的CascadeClassifier函数,这是一个预定义的函数,用于从预训练的XML文件(级联文件——车辆)中训练图像。
car_cascade_src = 'cars.xml'
car_cascade = cv2.CascadeClassifier(car_cascade_src)
cars = car_cascade.detectMultiScale(closing, 1.1, 1)
将使用上述返回的轮廓,并在检测到的车辆周围绘制一个矩形。
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")
image2 = Image.open(requests.get('https://qph.fs.quoracdn.net/main-qimg-b5c4e39dcd48dddd9e609e6022f74d85', stream=True).raw)
image2 = image2.resize((450,250))
image_arr2 = np.array(image2)
grey2 = cv2.cvtColor(image_arr2, cv2.COLOR_BGR2GRAY)
bus_cascade_src = 'Bus_front.xml'
bus_cascade = cv2.CascadeClassifier(bus_cascade_src)
bus = bus_cascade.detectMultiScale(grey2, 1.1, 1)
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")
cascade_src = 'cars.xml'
video_src = 'Cars.mp4'
cap = cv2.VideoCapture(video_src)
car_cascade = cv2.CascadeClassifier(cascade_src)
video = cv2.VideoWriter('result.avi', cv2.VideoWriter_fourcc(*'DIVX'), 15, (450,250))
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()