OpenCV--车辆数量统计/人流量统计实战

车辆数量统计

笔记和代码

python 复制代码
import cv2
import numpy as np

"""
车辆数量统计/人流量统计
"""

# 加载视频
cap = cv2.VideoCapture(',/video.mp4')

# 创建mog对象 预处理 去除背景:保证视频中能够精准捕捉车辆(前景)
mog = cv2.createBackgroundSubtractorMOG2()

# 创建腐蚀核 矩形
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

# 设置外接矩形过滤阈值
min_w = 100
min_h = 90

# 设置检测线,当车辆过这条线时再统计个数
line_high = 600
# 设置车辆数组,判断车辆是否在检测线值+-offset的范围内
cars = []
# 车辆个数
car = 0
# 设置偏移量 便于在检测线附近检测
offset = 6


# 计算外接矩形的中心点坐标
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

# 循环读取视频
while True:
    # 读取每一帧数据,返回标记和这一帧数据
    ret, frame = cap.read()
    # ret为True,表示读到了数据
    if ret:

        # 把原始帧进行灰度化,然后去噪
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 高斯去噪
        blur = cv2.GaussianBlur(gray, (3, 3), 5)

        # 去除背景
        frame_mask = mog.apply(blur)

        # 还是存在噪点 我们使用腐蚀和膨胀
        erode = cv2.erode(frame_mask, kernel)
        # 腐蚀可能让车辆也变小了,我们多膨胀几次
        dilate = cv2.dilate(erode, kernel, iterations=2)

        # 去除车辆内部的噪点(闭运算)
        close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)

        # 查找轮廓 轮廓记序号方法:cv2.RETR_TREE, 近似轮廓:cv2.CHAIN_APPROX_SIMPLE
        contours, hierarchy = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

        # 画出检测线,过这条线后再统计车辆个数
        cv2.line(frame, (10, line_high), (1200, line_high), (255, 255, 0), 3)

        # 画出所有检测出来的轮廓
        for contour in contours:
            # 最大外接矩形 矩形的起始坐标(x, y),矩形的长宽wh
            (x, y, w, h) = cv2.boundingRect(contour)
            # 根据外接矩形的wh大小过滤小矩形(非车辆的干扰因素)
            is_valid = (w >= min_w) and (h >= min_h)
            if not is_valid:
                continue
            # 如果符合条件,则画出来,要求坐标点都是整数
            cv2.rectangle(frame, (int(x), int(y)), (int(x + w), int(y + h)), (0, 0, 255), 2)

            # 把车抽象为一个点,即外接矩形的中心点,便于统计个数
            x_point, y_point = center(x, y, w, h)
            # 放入数组中 append放入的是列表,因为一次性可能有多个车过
            cars.append((x_point, y_point))
            # 把点画出来 -1表示实心点
            cv2.circle(frame, (x_point, y_point), 5, (0, 0, 255), -1)

            # 判断汽车是否过检测线
            for (x, y) in cars:
                if (line_high - offset) < y < (line_high + offset):
                    # 统计落入了区间 车辆计数加一,已经检测过的车辆移除
                    # 如果车辆统计不到位(有的车没有统计),可能是line_high和offset的值不合理
                    car += 1
                    cars.remove((x, y))

        # 显示车辆计数信息
        cv2.putText(frame, 'Vehicle Count:' + str(car), (500, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 5)
        cv2.imshow('video', close)
    # 1ms一帧
    key = cv2.waitKey(1)
    # 用户按esc退出
    if key == 27:
        break


# 释放资源
cap.release()
cv2.destroyAllWindows()
相关推荐
城事漫游Molly3 分钟前
质性研究AI工作流(六):质性研究质量检验的5维清单
人工智能·ai for science·定性研究
keykey6.4 分钟前
迁移学习实战:用预训练模型做图像分类
开发语言·人工智能·深度学习·机器学习
码农小旋风6 分钟前
上下文工程
人工智能·chatgpt·claude
火山引擎开发者社区8 分钟前
开启报名 | 首届火山「AI安全攻防」挑战赛邀你参赛
人工智能
DXM05219 分钟前
第8期| 传统机器学习遥感解译:SVM & 随机森林分类全流程实操
人工智能·python·随机森林·机器学习·支持向量机·arcgis·自然语言处理
程序员差不多先生9 分钟前
Copilot 取消年费改按量计费:AI Coding 工具进入了什么新阶段?
人工智能·copilot·github copilot
猿粪已尽9 分钟前
cc switch+codex+米醋 实现AI办公
人工智能·codex·cc switch·米醋·micu
装不满的克莱因瓶10 分钟前
深入PyTorch模型的训练与可视化 —— 掌握迁移学习等模型训练效果提升的办法
人工智能·pytorch·python·深度学习·神经网络·ai·迁移学习
段一凡-华北理工大学10 分钟前
工业领域的Hadoop架构学习~系列文章20:故障诊断与根因分析 - 从表象到本质的智能推理
大数据·人工智能·hadoop·学习·架构·高炉炼铁·工业智能体
凌云拓界11 分钟前
状态机与思考循环 ——CogitoAgent开发实战(一)
javascript·人工智能·架构·node.js·设计规范