使用OpenCV的车辆检测和计数系统-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
总结
在本文中,我们将编写一个车辆计数和检测系统。我们将在所有图像处理操作中使用OpenCV,并制作haar级联分类器来对汽车和公共汽车进行分类。您还可以创建自己的haar级联分类器。
范围
1.帮助交警:车辆检测和计数系统对交警有利,因为他们可以从一个地方监控一切,只需要知道有多少车辆和哪些车辆通过了收费站。
2.维修记录:由于车辆实时经过,有些人很难记录所有车辆。这与观看视频的人不同,他们可以暂停视频并对其进行评论,因此为了消除这种限制,该应用程序可以非常熟练地节省时间并实现自动化。
3.交通监控:由于此应用程序可以安装在任何地方,它只需要一个摄像头或一些电线(用于与中央系统建立连接),因此,如果某个区域的交通量很大,员工可以对其进行监控并将信息转发给下一个收费站,以便提前做好准备。
导入所需库
#导入库
从PIL导入图像
导入cv2
将numpy导入为np
导入请求
接下来,我们将从互联网上获取图像。然后我们将调整图像大小并将其转换为NumPy数组。
从URL读取图像
image=image.open(requests.get(‘https://a57.foxnews.com/media.foxbusiness.com/BrightCove/854081161001/201805/2879/931/524/854091161001/5782482890001/5782477388001-vs.jpg’,stream=True).raw)
image=image.resize((450250))
image_arr=np.array(图像)
形象
输出:
为了获得更好的输出,我们将对图像执行一些变换。这里,我们将图像转换为灰度。
灰度(Grayscale)
灰涩=cv2.cvt颜涩(图像_arr,cv2.COLOR_BGR2GRAY)
来自阵列的图像(灰涩)
输出:
接下来,我们将应用高斯模糊来去除图像中的噪声。
高斯模糊是图像处理技术之一。它还广泛用于图形设计中,以减少噪声和平滑图像,以便进一步预处理以产生更好的输出。
除了减少图像中的噪声,高斯模糊技术还减少了图像的细节。为了应用这种预处理技术,我们将使用GaussianBlur()函数。
高斯模糊
模糊=cv2.高斯模糊(灰涩,(5,5),0)
图像.fromarray(模糊)
输出:
这里,我们将应用图像膨胀,这是一种形态学技术。我们尝试用元素填充像素,也称为内核(结构化块),以在需要时填充图像的缺失部分。
注:与腐蚀相反。扩大
expansed=cv2.expanse(模糊,np.ones((3,3)))
图像.fromarray(放大)
输出:
现在我们将使用内核执行形态变换。这里,我们使用形态学Ex技术,它告诉函数要执行哪些图像处理操作。
第二个参数是关于必须完成哪些操作。您可能需要一个椭圆形/圆形内核。为了使用OpenCV来实现Morphology Ex方法,我们将使用getStructuringElement方法。
形态学-Ex,结构元素
内核=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2,2))
闭合=cv2.morphologyEx(扩张的,cv2.MORPH_CLOSE,内核)
Image.fromarray(关闭)
使用汽车级联检测汽车
现在我们需要一个汽车级联来检测汽车。因此,我们需要先将它们上传到collab(如果您在collab中这样做)。如果在本地计算机上执行此操作,请将级联文件添加到同一文件夹并指定路径car_cascade_src。
这里我们将使用CascadeClassifier函数,这是OpenCV的预定义函数,从预先训练的XML文件(cascadefile-car)中训练图像。我们需要检测多个对象,即汽车,才能使用detectMultiScale。
car_cascade_src=”cars.xml”
car_cascade=cv2.级联分类器(car_cascade_src)
cars=car_cascade.detectMultiScale(关闭,1.1,1)
汽车
输出:
大堆([[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)
我们将使用上面返回的轮廓,并在检测到的汽车周围绘制一个矩形。
在这里,我们将看到它将在每个检测到的车辆周围创建一个带有红涩边框的矩形。
cnt=0
对于汽车中的(x,y,w,h):
cv2.矩形(图像_arr,(x,y),(x+w,y+h),(255,0,0),2)
cnt+=1
打印(cnt,”找到汽车”)
图像.fromarray(图像_arr)
输出:
发现21辆车
总线检测
现在我们将使用另一个图像,巴士图像,我们将从互联网上获得。我们将调整图像大小,将其存储为NumPy数组,并将其转换为灰度。
#读取图像表单url
image2=Image.open(requests.get(‘https://qph.fs.quoracdn.net/main-qimg-b5c4e39dcd48dddd9e609e6022f74d85’,stream=True).raw)
image2=image2.调整大小((450250))
图像_ arr2=np.array(图像2)
灰涩2=cv2.cvt颜涩(图像_arr2,cv2.COLOR_BGR2GRAY)
我们在这里处理总线图像,因此我们需要级联来检测总线。我们将使用Bus_front级联从图像中识别总线,并将执行与上面类似的操作。
bus_cascade_src=”bus_front.xml”
总线_级联=cv2.级联分类器(总线_级联_ src)
bus=bus_cascade.detectMultiScale(灰涩2,1.1,1)
正如我们在汽车级联中所做的那样,当检测到任何公共汽车时,我们将对公共汽车图像执行相同的轮廓操作,并在公共汽车周围创建一个矩形。
cnt=0
对于总线中的(x,y,w,h):
cv2.矩形(图像_ arr2,(x,y),(x+w,y+h),(255,0,0),2)
cnt+=1
打印(cnt,”找到总线”)
图像.fromarray(图像_arr2)
输出:
找到1辆公共汽车
现在我们将在视频中执行车辆检测和计数。
要从帧或图像创建输出视频,我们需要cv2.VideoWriter()方法。它将扩展路径作为第一个参数;第二个参数是输出格式的编解码器,它还需要传递每秒帧数.高度和宽度。
cascade_src=”cars.xml”
视频_ src=”汽车.mp4″
cap=cv2.VideoCapture(video_src)
car_cascade=cv2.级联分类器(cascade_src)
video=cv2.VideoWriter(‘result.avi’,cv2.VideoWriter_fourcc(*’DIVX’),15,(450250))
现在我们将从输入视频中逐一读取帧,将其转换为灰度,并使用汽车级联来检测特定帧中的所有汽车。最后,我们使用视频。write()方法来写入视频和视频。release()将视频保存到给定路径。
当为True时:
ret,img=cap.read()
如果(类型(img)==类型(无)):
break gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cars=car_cascade.detectMultiScale(gray,1.1,2)
对于汽车中的(x,y,w,h):cv2.矩形(img,(x,y),(x+w,y+h),(0255255),2)
video.write(img)
video.release()
结论
我们首先下载要处理的图像并执行不同的操作。我们已经了解了如何使用haar级联进行目标检测,以及如何使用不同的haar级联来进行车辆检测和总线检测。类似地,您可以使用许多预先训练的haar级联进行其他对象检测。
因为haar级联用于对象检测,所以我们的范围非常广泛。它可以用于对象检测,我们也可以为特定对象创建自定义的haar级联。
尾注
这是本文的回购链接:
600学习网 » 使用OpenCV的车辆检测和计数系统-600学习网