• 15. 实例车辆统计


    车辆统计项目

    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

  • 相关阅读:
    linux下ssh端口的修改和登录
    linux找回密码
    XAMPP命令之LAMPP
    VirtualBox 复制vdi文件和修改vdi的uuid
    探讨PHP页面跳转几种实现技巧
    CSS盒模型和margin重叠
    8--数组旋转
    9--斐波那契数列
    7--动态规划
    6--树的遍历
  • 原文地址:https://www.cnblogs.com/TheoryDance/p/16414373.html
Copyright © 2020-2023  润新知