车辆检测与计数系统

在本文中,将探讨如何开发一个能够处理图像和视频的车辆检测与计数系统。将使用OpenCV库来执行所有的图像处理操作,并使用Haar级联分类器来识别和计数车辆和公交车。

系统范围与应用

该系统对于交通警察来说非常有用,因为它可以从一个单一的监控点监控多个交通情况,例如有多少车辆通过了收费站,以及具体是哪些车辆。此外,该系统还可以帮助维护交通记录,这对于实时通过的车辆来说是一项挑战,因为它们是连续不断的。通过自动化,该应用可以节省时间并提高效率。

交通监控控制:由于该应用只需要一个摄像头或一些连接到中央系统的电线,因此可以在任何地方安装。如果某个区域的交通量很大,那么从该区域的官员可以监控并提前通知下一个收费站的官员,以便他们做好准备。

导入所需库

from PIL import Image import cv2 import numpy as np import requests

接下来,将从互联网上获取图像,并对其进行缩放和转换为NumPy数组。

从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.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技术,这是一种告诉需要对哪些图像处理操作进行操作的技术。

形态学-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()
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485