ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

15. 实例--车辆统计

2022-06-26 21:36:06  阅读:152  来源: 互联网

标签:kernel 15 视频 -- car frame cv2 实例 close


车辆统计项目

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()

  • 代码中使用到的视频是通过在网上录下来的,上面没有进行车辆统计

5. 效果图

image

标签:kernel,15,视频,--,car,frame,cv2,实例,close
来源: https://www.cnblogs.com/TheoryDance/p/16414373.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有