车辆统计项目
1. 整体流程
- 加载视频
- 通过形态学识别车辆
- 对车辆进行统计
- 显示车辆统计信息
2. 关键技术
- 形态学
- 轮廓查找
3. 知识补充
背景减除(Background Subtraction)是许多基于计算机视觉的任务中的主要预处理步骤。如果我们有完整的静止的背景帧,那么我们可以通过帧差法来计算像素差从而获取到前景(Foreground)对象。但是在大多数情况下,我们可能没有这样的图像,所以我们需要我们拥有的任何图像中提取背景。当运动物体有阴影时,由于阴影也在移动,情况会变的更加复杂,为此引入了背景减除算法,通过这一方法,我们能够从视频中分离出运动的物体前景,从而达到目标检测的目的。
BackgroundSubstractorMOG
- 这是一个以混合高斯模型为基础的前景/背景分割算法,在2001年提出;
- 它使用K(K=3或5)个高斯分布混合对背景像素进行建模,使用这些颜色(在整个视频中)存在时间的长短作为混合的权重,背景的颜色一般持续的时间最长,而且更加静止。
- 在编写代码时,我们需要使用函数:
cv2.bgsegm.createBackgroundSubstractorMOG()
创建一个背景对象,这个函数有些可选参数,比如要进行建模场景的时间长度,高斯混合成分的数量,阈值等,将他们全部设置为默认值,然后再整个视频中我们是需要使用backgroundsubstractor.apply()
就可以得到前景的掩模了。
4. 实例代码
import cv2
import numpy as np
# 创建需要使用到的窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL) # 展示彩色帧效果
cv2.resizeWindow('video', 800, 480)
cv2.namedWindow('video2', cv2.WINDOW_NORMAL) # 展示帧掩码情况
cv2.resizeWindow('video2', 700, 760)
# 加载车流量视频
cap = cv2.VideoCapture('./car_flow.mp4')
# bgsegm = BackGround Subtractor 高斯混合
mog = cv2.bgsegm.createBackgroundSubtractorMOG()
kernel = np.ones((3, 3), np.uint8)
# 控制车辆的最小值,将识别的小轮廓进行剔除时使用
car_min_height, car_min_width = 30, 50
while True:
ret, frame_src = cap.read()
if ret:
frame = cv2.cvtColor(frame_src, cv2.COLOR_BGR2GRAY)
# 进行高斯过滤
frame = cv2.GaussianBlur(frame, ksize=(3, 3), sigmaX=5)
mask = mog.apply(frame)
mask2 = cv2.erode(mask, kernel, iterations=1) # 腐蚀
mask2 = cv2.dilate(mask2, kernel, iterations=2) # 膨胀
# 闭运算
close_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
close_result = cv2.morphologyEx(mask2, cv2.MORPH_CLOSE, close_kernel, iterations=3)
contours, hierarchy = cv2.findContours(close_result, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 循环轮廓,将小的轮廓给过滤掉
for contour in contours:
(x, y, w, h) = cv2.boundingRect(contour)
if w < car_min_width or h < car_min_height:
continue
cv2.rectangle(frame_src, (int(x), int(y)), (int(x + w), int(y + h)), (0, 0, 255), 2)
cv2.imshow('video2', np.vstack((mask, close_result)))
cv2.imshow('video', frame_src)
key = cv2.waitKey(5)
if key == 27:
break
cap.release()
cv2.destroyAllWindows()
- 代码中使用到的视频是通过在网上录下来的,上面没有进行车辆统计