基于opencv的车辆统计

车辆统计)

  • 一、项目背景
  • 二、整体流程
  • 三、常用滤波器的特点
  • 四、背景减除
  • 五、形态学
    • 开运算
    • 闭运算
  • 六、项目完整代码
  • 七、参考资料

一、项目背景

检测并识别视频中来往车辆的数量
最终效果图:

二、整体流程

  1. 加载视频
  2. 图像预处理(去噪、背景减除、形态学)
  3. 对车辆进行统计
  4. 显示车辆统计信息(增加水印)

车辆识别中首先对灰度化的视频帧进行去噪。二值化的目的是简化图像,并突出图像中的主要特征,可以减少后续处理的复杂性。
接下来用高斯模糊滤波去除不均匀的细小的噪声。常用滤波器特点总结如下:

三、常用滤波器的特点

  1. 方盒滤波(cv2.boxFilter)与均值滤波(cv2.blur)
    均值滤波需要额外的归一化过程
  2. 高斯滤波(cv2.GaussianBlur)
    高斯滤波的核心思想是让临近的像素具有更高的重要度。对周围像素计算加权平均值,较近的像素具有较大的权重值。
    尤其高斯噪声效果明显,对椒盐噪声效果不好
  3. 中值滤波(medianBlur)
    每个像素的值被替换为其邻域中所有像素值的中值,对椒盐噪音效果明显
  4. 双边滤波(bilateralFilter)
    对图像的边缘信息能更好的保存,双边滤波和高斯滤波不同的就是:双边滤波既利用了位置信息又利用了像素信息来定义滤波窗口的权重,而高斯滤波只用了位置信息。
    双边滤波可以保留边缘,同时可以对边缘内的区域进行平滑处理。
    双边滤波的作用就相当于做了美颜

四、背景减除

背景减除(Background Subtraction)是许多基于计算机视觉的任务中的主要预处理步骤。如果我们有完整的静止的背景帧,那么我们可以通过帧差法来计算像素差从而获取到前景对象。但是在大多数情况下,我们可能没有这样的图像,所以我们需要从我们拥有的任何图像中提取背景。当运动物体有阴影时,由于阴影也在移动,情况会变的变得更加复杂。为此引入了背景减除算法,通过这一方法我们能够从视频中分离出运动的物体前景,从而达到目标检测的目的。

  • BackgroundSubtractorMOG
    • 这是一个以混合高斯模型为基础的前景/背景分割算法。它是 P.KadewTraKuPong 和 R.Bowden 在 2001 年提出的。
    • 它使用 K(K=3 或 5)个高斯分布混合对背景像素进行建模。使用这些颜色(在整个视频中)存在时间的长短作为混合的权重。背景的颜色一般持续的时间最长,而且更加静止。
    • 在编写代码时,我们需要使用函数:cv2.createBackgroundSubtractorMOG() 创建一个背景对象。这个函数有些可选参数,比如要进行建模场景的时间长度,高斯混合成分的数量,阈值等。将他们全部设置为默认值。然后在整个视频中我们是需要使用backgroundsubtractor.apply() 就可以得到前景的掩模了。
    • 移动的物体会被标记为白色,背景会被标记为黑色的

得到前景掩模后,对视频帧进行开运算,以进一步除图像中的噪声、填充小孔和连接物体。

五、形态学

开运算

原理:先进行腐蚀操作,然后进行膨胀操作。腐蚀操作可以去除图像中的小细节和噪声,而膨胀操作可以保持物体的整体形状。
特点:
可以有效去除图像中的小白点(前景噪声)和连接细小的物体。
能够平滑物体的边缘并保持物体的整体形状。
可以用于断开物体之间的连接以及分割物体。

闭运算

原理:先进行膨胀操作,然后进行腐蚀操作。膨胀操作可以填充物体中的小孔和裂缝,而腐蚀操作可以保持物体的整体形状。
特点:
可以填充图像中的小孔和裂缝,使得物体更加完整。
可以连接物体之间的断裂部分,使它们形成连续的整体。
有助于平滑物体的边缘并保持其整体形状。

比较:
应用场景:开运算主要用于去除噪声和细小物体,闭运算主要用于填充小孔和连接物体。
效果:开运算更适合去除细小的噪声和连接细小的物体,闭运算更适合填充小孔和连接断裂的物体。
形状保持:两者都可以保持物体的整体形状,但开运算可能会略微削弱物体的尺寸,而闭运算则可能略微增加物体的尺寸。
在实际应用中,开运算和闭运算常常结合使用,以便达到更好的图像处理效果,例如先进行开运算去除噪声,然后进行闭运算填充孔洞,以得到更加干净和完整的物体。

图像预处理完成后,用外接矩形画出车辆轮廓,识别出的图像中较小的轮廓忽略掉。统计车辆数据时判断外接矩形的中心点是否通过检测线统计经过检测线的车辆数目。

六、项目完整代码

# 去背景
# 加载视频
import cv2
import numpy as np

cap = cv2.VideoCapture('./video.mp4')
bgsubmog = cv2.bgsegm.createBackgroundSubtractorMOG()
# 形态学kernel,相当于设置卷积核为5x5的矩形元素卷积核
kernel= cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
min_w = 90
min_h = 90
cars = []
# 检测线高, 和视频的宽高有关系
line_high = 620
# 线的偏移量
offset = 7
carno = 0

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()
    
    if ret == True:
        # 将原始帧进行灰度化, 然后去噪
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 用高斯滤波去噪
        blur = cv2.GaussianBlur(gray, (3, 3), 5)
        # 获取前景掩码
        mask = bgsubmog.apply(blur)
        # 去掉了一些干扰噪声
        erode = cv2.erode(mask, kernel)
        # 再把图像还原回来, 执行膨胀操作
        dilate = cv2.dilate(erode, kernel, iterations=2)
        
        # 闭操作, 把物体内部的小块
        close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel, iterations=2)
        
        # 查找轮廓
        result, contours, h = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        # 画出检测线
        cv2.line(frame, (10, line_high), (1200, line_high), (255, 255, 0), 3)
        # 画出轮廓
        for (i, c) in enumerate(contours):
            (x, y, w, h) = cv2.boundingRect(c)
            cv2.rectangle(frame, (int(x), int(y)), (int(x + w), int(y + h)), (0, 0, 255), 2)
            
            # 通过外接矩形的宽高大小来过滤掉小轮廓.
            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)
            # 把车抽象为一点. 即矩形的中心点.
            cpoint = center(x, y, w, h)
            cars.append(cpoint)
            # 画出中心点
            cv2.circle(frame, (cpoint), 5, (0, 0, 255), -1)
            # 判断汽车是否过线. 
            for (x, y) in cars:
                if y > (line_high - offset) and y < (line_high + offset):
                    # 落入了有效区间. 
                    # 计数加1
                    carno += 1
                    cars.remove((x, y))
                    print(carno)
        # 打印计数信息
        cv2.putText(frame, 'Vehicle Count:' + str(carno), (500, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 0, 0), 5)
        cv2.imshow('frame', frame)
        
    key = cv2.waitKey(10)
    if key == 'q':
        break
cap.release()
cv2.destroyAllWindows()

七、参考资料

https://blog.csdn.net/great_yzl/article/details/119645423#%E5%9F%BA%E7%A1%80%E7%90%86%E8%AE%BA
https://blog.csdn.net/qq_27261889/article/details/80822270
https://blog.csdn.net/Vermont_/article/details/108424547

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/605401.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

航空电子FC节点卡, FC交换机,主要采用LC或MPO光纤接口形式

FC节点卡主要采用LC或MPO光纤接口形式&#xff0c;可以作为4/2个独立端口使用&#xff0c;也可以作为2对/1对冗余端口使用&#xff0c;支持1.0625Gbps、2.125Gbps、4.25Gbps、8.5Gbps通信速率。节点卡完全遵循FC-LS&#xff0c;FC-FS&#xff0c;FC-AE-ASM、FC-AE-1553B等FC光纤…

springboot+vue+mybatis家教管理系统的设计与实现+PPT+论文+讲解+售后

家教管理系统是为了方便用户能够在网站上查看教师信息进行家教预约等&#xff0c;于是开发了基于springboot框架设计与实现了一款简洁、轻便的家教管理系统。本系统解决了家教管理事务中的主要问题&#xff0c;包括以下多个功能模块&#xff1a;公告信息、留言信息、预约家教老…

Isaac Sim 4 键盘控制小车前进方向(学习笔记5.8.2)

写的乱糟糟&#xff0c;主要是这两周忘了记录了...吭哧吭哧往下搞&#xff0c;突然想起来要留档&#xff0c;先大致写一个&#xff0c;后面再往里添加和修改吧&#xff0c;再不写就全忘了 有一个一直没解决的问题&#xff1a; 在保存文件时出现问题&#xff1a;isaac sim mism…

【OceanBase诊断调优】—— 磁盘性能问题导致卡合并和磁盘写入拒绝排查

适用版本 OceanBase 数据库 V3.x、V4.x 版本。 问题现象 OceanBase 集群合并一直未完成&#xff0c;同时 tsar 和 iostat 显示从凌晨 2:30 开始磁盘使用率一直是 100%。怀疑合并导致 IO 上升&#xff0c;IO 可能存在问题&#xff0c;observer.log 的确有大量报错 disk is hu…

概述篇——计算机网络学习笔记(基于谢希仁教材与PPT)

教材用的是谢希仁的教材&#xff0c;图片来源于谢希仁老师配套的PPT 计算机网络课程PPT&#xff08;通过这个链接&#xff0c;你可以找到课程配套的ppt&#xff09; 计算机网络的定义及其特点 定义 网络 过去大众熟知的三种网络分别是提供电话、电报及传真等服务的电信网络&am…

Linux主机排查工具-GScan

0x01 简介 本程序旨在为安全应急响应人员对Linux主机排查时提供便利&#xff0c;实现主机侧Checklist的自动全面化检测&#xff0c;根据检测结果自动数据聚合&#xff0c;进行黑客攻击路径溯源。 0x02 项目地址 https://github.com/grayddq/GScan 0x03 CheckList检测项 自…

每日一题——力扣面试题 17.04. 消失的数字

题目链接&#xff1a;https://leetcode.cn/problems/missing-number-lcci/description/ 菜鸡做法&#xff1a; #include <stdlib.h> // 包含标准库头文件&#xff0c;用于内存分配等功能// 函数定义&#xff1a;寻找缺失的数字 int missingNumber(int* nums, int numsSi…

从离线到实时:无锡锡商银行基于 Apache Doris 的数据仓库演进实践

作者&#xff1a;武基鹏&#xff0c;无锡锡商银行 大数据技术经理 编辑整理&#xff1a;SelectDB 技术团队 导读&#xff1a;为实现数据资产的价值转化以及全面数字化、智能化的风险管理&#xff0c;无锡锡商银行大数据平台经历从 Hive 离线数据仓库到 Apache Doris 实时数据仓…

Hive SQL-DQL-Select查询语句用法详解

HQL Select用法详解 1.基础语法 &#xff08;1&#xff09;select_exp &#xff08;2&#xff09;ALL、DISTINCT &#xff08;3&#xff09;WHERE &#xff08;4&#xff09;分区查询、分区裁剪 &#xff08;5&#xff09;GROUP BY &#xff08;6&#xff09;HAVING &#xff0…

hadoop学习---基于Hive的教育平台数据仓库分析案例(三)

衔接第一部分&#xff0c;第一部分请点击&#xff1a;基于Hive的教育平台数据仓库分析案例&#xff08;一) 衔接第二部分&#xff0c;第二部分请点击&#xff1a;基于Hive的教育平台数据仓库分析案例&#xff08;二) 学生出勤模块&#xff08;全量分析&#xff09;&#xff1a…

Densenet+SE

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言 前言 这周开始学习关于经典模型的改进如加注意力机制&#xff0c;这周学习Densenet加通道注意力即SE注意力机制。 ##SE注意力机制简介 SE&#xff08;…

自定义shell

1、首先我们的程序要打印出命令行 命令行》用户名【主机名】当前路劲$:命令字符串 用户名、主机名、当前路径可以通过系统调用函数getenv()得到&#xff1a; 2、获取命令字符串 把输入的命令字符串放到一个指针数组中 但是我们发现用scanf函数输入的话&#xff0c;遇到空…

【数据结构】-- 链表专题

链表的分类 前面我们实现了单链表&#xff0c;单链表只是链表的一种。可以根据以下几个标准来判断链表的类型&#xff1a; 1.单向或者双向 如图所示&#xff0c;单向链表中一个节点的指针域只储存了下一个节点的指针&#xff0c;能通过前一个节点访问后一个节点&#xff0c;无…

Vue 3.3 编译宏 vue3.3新增了一些语法糖和宏,包括泛型组件、defineSlots、defineEmits、defineOptions

Vue 3.3新增了一些语法糖和宏&#xff0c;包括泛型组件、defineSlots、defineEmits、defineOptions defineProps 父组件传参 <template><Child name"my"></Child> </template> <script setup lang"ts"> import Child fro…

使用Docker安装Yapi接口管理工具

简介&#xff1a; YAPI 是由去哪儿网移动架构组开发的一款可视化接口管理工具。它具有可视化管理、高效易用、功能强大等特点。它提供了便捷的接口创建、发布和维护方式&#xff0c;开发人员可以通过简单的操作实现接口管理。 YAPI 还支持类似 postman 的接口调试&#xff0c;对…

06-数组

1. 为什么需要数组 一个养鸡场有6只鸡&#xff0c;它们的体重分别是3kg&#xff0c;4kg&#xff0c;1kg&#xff0c;2kg&#xff0c;6kg&#xff0c;3kg。 没有数组&#xff0c;就需要定义六个变量&#xff0c;一个变量代表一只鸡的体重。 使用数组&#xff0c;就可以定义一…

TypeScript学习日志-第二十三天(装饰器Decorator)

装饰器Decorator 一、类装饰器 ClassDecorator 其中返回的 target 是 Http 的构造函数&#xff0c;有了构造函数就不会去破坏其自身原有的结构&#xff0c;当我们 Http 里面有多个属性或者方法的&#xff0c;当是我们不想看或者改变它&#xff0c;这时候可以在构造函数中增加即…

【Mybatis操作数据库】入门(一)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MyBatis框架】 本专栏旨在分享MyBatis框架的学习笔记&#xff0c;如有错误定当洗耳恭听&#xff0c;欢迎大家在评论区交流讨论&#x1f…

59岁前TVB男拳王内地登台疑黑面 被批耍大牌

现年59岁的郭政鸿在2015年离巢TVB后转往内地发展&#xff0c;密密拍剧、登台及直播带货&#xff0c;短短几年就已经储够钱&#xff0c;斥资过千万买楼&#xff0c;成功上车做业主&#xff0c;可见收入丰厚。 早前郭政鸿现身顺德&#xff0c;在酒吧登台唱歌&#xff0c;有网民上…

《铁路出行更便捷:火车票预定审批系统的设计与应用》

在现代化的铁路交通管理中&#xff0c;火车票预定审批系统扮演着至关重要的角色。它不仅能够有效管理员工出差、培训等需要乘坐火车的行程&#xff0c;还能够提高审批效率&#xff0c;减少人力成本&#xff0c;确保出行安全。本文将探讨火车票预定审批系统的设计原则和应用场景…