车辆统计项目
涉及到的内容:
窗口的展示
图像和视频的加载
基本图像的绘制
车辆识别(基本图像运算和处理,形态学,轮廓查找)
整体流程:
1.加载视频
2.通过形态学识别车辆
3.对车辆进行统计
4.显示车辆统计的信息
补充知识:
背景剪处:把不会动的东西叫做背景(blackground),能动的物体叫做前景(foreground)
import cv2
import numpy as np
cap = cv2.VideoCapture(r'D:\photo\data\car.mp4')
#创建mog对象
mog = cv2.bgsegm.createBackgroundSubtractorMOG()
kernel = cv2.getStructuringElement (cv2.MORPH_RECT,(5,5))
min_w = 50
min_h = 50
line_high = 310
#计算外接矩形的中心点
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 =9
cars = []
carno = 0
#循环读取视频帧
while True:
ret, frame =cap.read()
if ret == True:
#把原始数据灰度化
gray = cv2.cvtColor (frame,cv2.COLOR_BGR2GRAY)
#去噪
blur = cv2.GaussianBlur(gray,(3, 3),5)
mask =mog.apply(frame)
#腐蚀
erode = cv2.erode (mask,kernel)
#膨胀
dialte = cv2.dilate(mask,kernel,iterations=2)
#消除内部的方块,闭运算
close = cv2.morphologyEx(dialte,cv2.MORPH_CLOSE,kernel)
#查找轮廓
contours, h = cv2.findContours (close,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#画出检测先
cv2.line(frame,(10,line_high),(950,line_high),(0,125,255),5)
#画出所以检测处的轮廓
for contour in contours:
#最大外接矩形
(x,y,w,h) = cv2.boundingRect(contour)
# 通过外接矩形的宽高大小去掉小矩形
is_vaild = (w >=min_w) and (h >= min_h)
if not is_vaild:
continue
#要求坐标点都是整数
cv2.rectangle(frame,(int(x),int(y),int(w),int(h)),(0,0,255),2)
#把车抽象成一点,即外接矩形的中心点
cpoint = center(x, y, w, h)
cars.append(cpoint)
cv2.circle (frame,(cpoint), 5,(0,0,255),-1) #-1表示实心的
#判断车是否过检测线
for (x, y) in cars:
if y > (line_high - offset) and y < (line_high + offset):
#落入有效区
#计数加1
carno += 1
cars.remove((x,y))
#如何画线
#如何计数
cv2.putText (frame,'vehicle Count:' +str(carno), (50,50), cv2.FONT_HERSHEY_SIMPLEX , 2,(0,0,255), 5)
cv2.imshow('frame',frame)
key = cv2.waitKey(50)
#用户按ESC退出
if key == 27:
break
#最后来释放资源
cap.release()
cv2.destroyAllWindows()