基于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://xiahunao.cn/news/3019561.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Elasticsearch运维系列】Elasticsearch7.12.1启动指定版本JDK:你学废了吗?

一、背景 一套生ES集群&#xff0c;版本为7.12.1&#xff0c;近期频繁告警&#xff0c;频繁出现索引分片异常&#xff0c;索引状态异常&#xff0c;导致应用无法正常写入ES&#xff0c;另外&#xff0c;也经常出现节点掉问题。通过分析相关ES日志&#xff0c;显示和当前JAVA G…

【微机原理及接口技术】8086/8088系统时序和微机总线

【微机原理及接口技术】8086/8088系统时序和微机总线 文章目录 【微机原理及接口技术】8086/8088系统时序和微机总线前言一、8086/8088引脚信号和工作模式1.8088 的两种组态模式2.最小组态的引脚信号3.最小组态的总线形成4.最大组态的总线形成 二、8086/8088典型时序1.三种周期…

人工智能|推荐系统——工业界的推荐系统之序列建模

一、LastN特征 LastN&#xff1a;⽤户最近的&#x1d45b; 次交互&#xff08;点击、点赞等&#xff09;的物品ID。 对LastN物品ID做embedding&#xff0c;得到 &#x1d45b; 个向量。 把 &#x1d45b; 个向量取平均&#xff0c;作为⽤户的⼀种特征。 适⽤于召回双塔模型、…

Python 全栈体系【四阶】(四十一)

第五章 深度学习 九、图像分割 1. 基本介绍 1.1 什么是图像分割 图像分割&#xff08;Segmentation&#xff09;是图像处理和机器视觉一个重要分支&#xff0c;其目标是精确理解图像场景与内容。图像分割是在像素级别上的分类&#xff0c;属于同一类的像素都要被归为一类&a…

论文查重率高,有什么办法降重吗?

现在大部分学校已经进入到论文查重降重的阶段了。如果查重率居高不下&#xff0c;延毕的威胁可能就在眼前。对于即将告别校园的学子们&#xff0c;这无疑是个噩梦。四年磨一剑&#xff0c;谁也不想在最后关头功亏一篑。 查重率过高&#xff0c;无非以下两种原因。要么是作为“…

Vue3基础(API风格、监听、生命周期、toRefs、组件通信、插槽、axios,Promise)

Vue3基础&#xff08;API风格、监听、生命周期、toRefs、组件通信、插槽、axios&#xff0c;Promise&#xff09; 目录 Vue3基础&#xff08;API风格、监听、生命周期、toRefs、组件通信、插槽、axios&#xff0c;Promise&#xff09;API 风格选项式API组合式API混合式 事件监听…

DDD架构学习

文章目录 领域建模事件风暴四色建模法 DDD名称解析领域子域核心域通用域支撑域限界上下文战术设计实体值对象聚合和聚合根工厂资源库领域服务领域事件 DDD代码的分层名词解析实体值对象聚合根领域服务领域事件 VO&DTO&DO&PO博客 领域建模 领域驱动设计的核心在于领…

互联网产品为什么要搭建会员体系?

李诞曾经说过一句话&#xff1a;每个人都可以讲5分钟脱口秀。这句话换到会员体系里面同样适用&#xff0c;每个人都能聊点会员体系相关的东西。 比如会员体系属于用户运营的范畴&#xff0c;比如怎样用户分层&#xff0c;比如用户标签及CDP、会员积分、会员等级、会员权益和付…

手拿滑块撕瑞数 我叫超弟你记住!!什么腾讯滑块、数美、顶象、阿里通通拿下!最新版2024.5.8号

本文章非标题党&#xff0c;可提供主流验证码解决方案及成品、补环境框架、逆向教学 不论你是逆向小白、亦或是需求方都可通过本文章各取所需&#xff01;&#xff01; 废话不多说&#xff0c;老规矩&#xff0c;附上腾讯旗下验证码程序运行图&#xff0c;附程序运行时间 &…

【稳定检索|EI会议】✅2024年食品科学与生物医学国际会议(ICFSBS 2024)✅

2024 International Conference on Food Science and Biomedical Sciences 一、大会信息 会议名称&#xff1a;2024年食品科学与生物医学国际会议会议简称&#xff1a;ICFSBS 2024收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等会议官网&#xff1a;http:/…

揭秘SSL证书一年费用:网络安全预算规划指南

网络安全在数字化时代的重要性不言而喻&#xff0c;而SSL证书作为保护网站安全的关键工具&#xff0c;其费用问题自然成为了用户们关注的重点。本文旨在深入分析SSL证书的一年所需成本&#xff0c;帮助用户们合理规划自己的网络安全预算。 我们需要了解SSL证书的基本概念。SSL…

中国 Copilot 能在笔记本电脑上起飞吗?

AI PC 是 PC 的下一个进化体&#xff1f; 中国能打造出自己的 AI 研发助手吗&#xff1f; 企业如何构建 AI 竞争力&#xff1f; AI 时代&#xff0c;个体如何避免被取代&#xff1f; 如果你也有此困惑&#xff0c;那就锁定这场直播吧&#xff01; 视频号搜索【极狐GitLab】预约…

AI编码工具-通义灵码功能实测

AI编码工具-通义灵码功能实测 通义灵码功能介绍行级/函数级实时续写自然语言生成代码单元测试生成异常排错智能排查生成代码注释生成代码解释研发领域自由问答 在上一篇文章中&#xff0c;我介绍了通义灵码的功能以及支持的操作系统&#xff0c;主流IDE等&#xff0c;详细内容可…

web前端框架设计第八课-表单控件绑定

web前端框架设计第八课-表单控件绑定 一.预习笔记 1.v-model实现表单数据双向绑定 2.搜索数据的实现 3.全选案例实现1—JQ方法 4.单选案例实现 二.课堂笔记 三.课后回顾 –行动是治愈恐惧的良药&#xff0c;犹豫拖延将不断滋养恐惧

图数据库 之 Neo4j 与 AI 大模型的结合绘制知识图谱

引言 随着信息时代的到来&#xff0c;海量的文本数据成为了我们获取知识的重要来源。然而&#xff0c;如何从这些文本数据中提取出有用的信息&#xff0c;并将其以可视化的方式展示出来&#xff0c;一直是一个具有挑战性的问题。近年来&#xff0c;随着人工智能技术的发展&…

Codeforces Round 943 (Div. 3) A~G1

A.Maximize?&#xff08;枚举&#xff09; 题意&#xff1a; 给你一个整数 x x x。你的任务是找出任意一个整数 y y y ( 1 ≤ y < x ) (1\le y\lt x) (1≤y<x)&#xff0c;使得 gcd ⁡ ( x , y ) y \gcd(x,y)y gcd(x,y)y为最大可能数。 ( 1 ≤ y < x ) (1\le y\lt…

青云租受邀出席2024(第十一届)品牌影响力发展大会

武汉青青时代网络科技有限公司倾力打造的共享经济新租赁电商平台“青云租”成功入选“中国最佳商业模式创新奖、中国共享经济十大标杆企业、中国最具投资发展价值轻创业诚信平台”&#xff0c;并将受邀出席2024(第十一届)品牌影响力发展大会暨成果发布活动。 本届活动将于2024…

知名员工上网行为管理系统推荐榜单

上网行为管理软件旨在帮助组织监控和管理员工的网络活动&#xff0c;以提高工作效率、确保网络安全和合规性。以下是一些常见的上网行为管理软件&#xff1a; Ping32&#xff1a;Ping32是一款专业的员工上网行为管理系统&#xff0c;Ping32作为一款专业的员工上网行为管理系统&…

会声会影下载免费中文版 会声会影2023破解 会声会影中文汉化补丁包 会声会影永久激活版序列号免费 会声会影安装使用教程

会声会影是加拿大Corel公司制作的一款功能强大的视频编辑软件&#xff0c;正版英文名&#xff1a;Corel VideoStudio&#xff0c;具有图像抓取和编修功能&#xff0c;可以抓取&#xff0c;转换MV、DV、V8、TV和实时记录抓取画面文件&#xff0c;并提供有超过100 多种的编制功能…

Maven+Junit5 + Allure +Jenkins 搭建 UI 自动化测试实战

文章目录 效果展示Junit 5Junit 5 介绍Junit 5 与 Junit 4 对比PageFactory 模式编写自动化代码公共方法提取测试用例参数化Jenkins 搭建及配置参数化执行生成 Allure 报告Maven 常用命令介绍POM 文件效果展示 本 chat 介绍 UI 自动化测试框架的搭建: 运用 page factory 模式…