**利用opencv可以实现视频中公路上的车辆数量检测,但是opencv的识别准确率不够高,如需提高准确率还得使用深度学习的一些算法。**以下附上源码:
#导包
import cv2
import numpy as np
#计算矩形中心点
def center(x,y,w,h):
x1=int(w/2)
y1=int(h/2)
cx=int(x)+x1
cy=int(y)+y1
return cx,cy
#划线偏移量
offset=8
#线高
line_high=600
#存放车中心点的列表
cars=[]
#车数量
num=0
#读取摄像头
video=cv2.VideoCapture('./9b3ae12a0660e8daa0e3cb42ab26377d.mp4')
#mog算法,创建mog对象
mog=cv2.createBackgroundSubtractorMOG2()
#获取形态学卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
#循环读取数据
while True:
#ret为标志位,读取到视频时为True,否则为False
#frame为读取的视频
ret,frame=video.read()
#如果读取到视频
if ret:
#灰度化处理
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#去噪,高斯滤波
#blur=cv2.boxFilter(gray,-1,(9,9))
blur=cv2.GaussianBlur(gray,(7,7),5)
#blur=cv2.bilateralFilter(gray,5,120, 150)
#创建前景掩码
mask=mog.apply(blur)
#腐蚀操作
erode = cv2.erode(mask,kernel,iterations=1)
#膨胀,把图像还原回来
dilate=cv2.dilate(erode,kernel,iterations=1)
#消除小方块,闭运算
close=cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)
#查找轮廓
contours, hierarchy=cv2.findContours(close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#划线
cv2.line(frame,(10,line_high),(1200,line_high),(0,0,255),thickness=2)
#画出轮廓
for contour in contours:
#最大外接矩形
x,y,w,h=cv2.boundingRect(contour)
#过滤小框
is_valid=(w>60) &(h>50)
if not is_valid:
continue
#画矩形
cv2.rectangle(frame,(int(x),int(y)),(int(x+w),int(y+h)),(0,255,0),2)
#车中心点
cpoint=center(x,y,w,h)
#将中心点加入列表
cars.append(cpoint)
#以中心点为中心画圆
cv2.circle(frame,(cpoint),5,(0,255,0),-1)
#判断汽车过检测线
for (x,y) in cars:
#检测范围以内
if y>(line_high-offset) and y<(line_high+offset):
#车数量加一
num+=1
#移除已经计算的
cars.remove((x,y))
#打印车的数量
print('车的数量为:',num)
#展示视频
#cv2.imshow('erode',erode)
#cv2.imshow('dilate',close)
#在图上加文本
cv2.putText(frame,'Vehicle Counts:'+str(num),(500,60),cv2.FONT_HERSHEY_SIMPLEX,2,(255,0,0),5)
#显示图像
cv2.imshow('frame',frame)
#10ms一帧,可自己修改
key=cv2.waitKey(10)
#可按ESC退出视频展示
if key == 27:
break
#释放资源
video.release()
#关闭窗口
cv2.destroyAllWindows()