基于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 npcap = 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 = 0def center(x, y, w, h):x1 = int(w/2)y1 = int(h/2)cx = int(x) + x1cy = int(y) + y1return cx, cywhile 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):# 落入了有效区间. # 计数加1carno += 1cars.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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++类和对象中篇

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;[C] &#x1f4a8;路漫漫其修远兮 吾将而求索 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 文章目录 &#x1f4d4;前言&#x1f4d4;1、类的六个…

视频汇聚边缘网关EasyCVR硬件设备无法访问域名,解析失败该如何处理?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备传统安防视…

小麦穗检测数据集VOC+YOLO格式6508张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6508 标注数量(xml文件个数)&#xff1a;6508 标注数量(txt文件个数)&#xff1a;6508 标注…

实践指南:如何将SpringBoot项目无缝部署到Tomcat服务器

序言 SpringBoot 是一个用来简化 Spring 应用初始搭建以及开发过程的框架&#xff0c;我们可以通过内置的 Tomcat 容器来轻松地运行我们的应用。但在生产环境中&#xff0c;我们可能需要将应用部署到独立的 Tomcat 服务器上。本文给大家介绍 SpringBoot 项目部署到独立 Tomcat…

JS-拖拽元素放大缩小

效果左右布局&#xff0c;拖拽后&#xff0c;宽度放大缩小 其实自己写也可以&#xff0c;不过还是发现了两个好用的js库&#xff0c;既然不需要自己写&#xff0c;当然是能偷懒就偷懒 1、resizerjs 官网地址&#xff1a;https://github.com/eknowles/resizerjs <!doctype …

ssrf初步

一&#xff0c;简介 全称&#xff1a;Server-Side Request Forgery&#xff08;中文&#xff1a;服务器端请求伪造&#xff09; 攻击者从服务端发起请求&#xff0c;让服务器连接任意外部系统&#xff0c;从而泄露敏感数据。主要利用各种协议的请求伪造&#xff0c;例如php协…

IDEA使用Maven生成普通项目没有生成iml文件解决方法

右击主目录选择&#xff1a; Open in Terminal 在生成的控制台输入&#xff1a; mvn idea:module 回车便自动生成iml文件啦&#xff01; 双击下主目录就可以看见啦

数据分析概念定义和发展前景

数据分析概念定义和发展前景 前言一、数据分析概念二、数据的定义数据的定义数据的分类定性数据定量数据 三、数据的价值数据为什么具有价值 四、数据分析的目的对于企业来说总结 五、数据分析类型的划分描述性统计分析探索性数据分析传统的统计分析方法验证性数据分析 六、 数…

【亲测可用】linux centos7.9 快速安装python3环境 手把手实操教程

安装好linux centos7.9 默认只有python2的环境如下&#xff1a; python2.7.5这个很老旧的版本了&#xff0c;有很多新库不支持&#xff0c;性能可能也不行。 接下来快速安装python3环境&#xff0c;并设置源做到快速安装包&#xff0c;设置虚拟环境&#xff0c;打造强大的pyth…

MacOS搭建docker本地私有镜像库

相关环境 macOS: bigsur 11.7.8 docker desktop: 4.22.0 docker engine: 24.0.5 准备工作 本机已经安装好docker desktop&#xff0c;未安装的自行参考其他教程。如果不能翻墙&#xff0c;可以修改本地的镜像地址&#xff0c;可在docker desktop 设置中的docker engine中修…

Redis-新数据类型-Bitmaps

新数据类型-Bitmaps 简介 在计算机中&#xff0c;用二进制&#xff08;位&#xff09;作为存储信息的基本单位&#xff0c;1个字节等于8位。 例如 “abc” 字符串是由 3 个字节组成&#xff0c;计算机存储时使用其二进制表示&#xff0c;"abc"分别对应的ASCII码是 …

数据结构与算法 知识点整理

线性表 线性表的基本概念 线性表的定义&#xff1a;线性表是一个具有相同特性的数据元素的有限序列。 相同特性&#xff1a;所有元素属于同一数据类型 有限&#xff1a;数据元素个数是有限的 序列&#xff1a;数据元素由逻辑序号&#xff08;逻辑位序&#xff09;唯一确定…

Oracle SQL Developer导出数据库表结构,表数据,索引以及序列号等对象

目录 一、业务需求 三、环境说明 三、数据导出 四、数据导入 一、业务需求 通过Oracle SQL Developer软件将指定oracle数据库中的表结构&#xff0c;表数据&#xff0c;索引以及序列号等对象导出成SQL文件。 三、环境说明 数据库版本&#xff1a;Oracle Database 11g Expres…

【管理篇】如何向上沟通?

目录标题 向上沟通中下列问题最普遍和上级能不聊就不聊拿捏不好该不该和上级聊的分寸和尺度很难领会到上级的意图如何影响上级的一些观点和决策? 如何应对上述问题呢&#xff1f;&#x1f60e;如何管理上级&#xff1f;&#x1f44c; 向上沟通中下列问题最普遍 和上级能不聊就…

sql函数--10---In 多个字段

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.普通 in语句查询sqlMyBatis错误写法正确写法ListString[] 2.In多个字段sql案例脚本实例&#xff1a;错误写法&#xff1a;正确写法&#xff1a; MyBatis XML 写法…

Spring 事务及事务传播机制(1)

目录 事务 回顾: 什么是事务 为什么需要事务 事务的操作 Spring事务的实现 Spring编程式事务(简单了解即可, 问就是基本不用) 观察事务提交 观察事务回滚 Spring声明式事务 Transactional Transactional作用 事务 回顾: 什么是事务 定义: 事务是指逻辑上的一组操作, 构…

语义分割——前列腺分割数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

JVM认识之垃圾收集算法

一、标记-清除算法 1、定义 标记-清除算法是最基础的垃圾收集算法。它分为标记和清除两个阶段。先标记出所有需要回收的对象&#xff08;即垃圾&#xff09;&#xff0c;在标记完成后再统一回收所有垃圾对象。 2、优点和缺点 优点&#xff1a;实现简单缺点&#xff1a; 可能…

初阶数据结构之单链表详解

目录 一&#xff1a;单链表概念 二&#xff1a;单链表的基本操作 1.定义结点 2.创建链表&#xff08;初始化链表&#xff09; 3:新增结点 4.单链表尾插 5.单链表头插 6.单链表尾删 7&#xff1a;单链表头删 8.打印单链表 9.查找单链表结点 10.单链表删除指定结点 1…

Centos7 安装 MySQL5.7 使用 RPM 方式

1 访问网站 https://downloads.mysql.com/archives/community/ 选择合适的版本&#xff0c;点击 Download。 2 上传下载好的 mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar 文件到 Centos7 机器&#xff0c;这里放到了 下载 目录。 3 解压 mysql-5.7.44-1.el7.x86_64.rpm-bundle.…