opencv实战项目七:帧差法获取运动车辆蒙版

文章目录

  • 一、简介
  • 二、实现方案
  • 三、算法实现步骤
    • 3.1 取出视频中间帧
    • 3.2 帧差法形成运动蒙版:
  • 四、代码整体实现
  • 五:效果


一、简介

在智能交通系统中,车辆检测是一项重要的技术,而通常情况下一张图片中无用信息过多会带来额外的计算负担,这时我们就可以使用帧差法来对无用信息进行过滤,利用视频序列中的帧间差异来检测运动车辆,排除掉路面以及天空等信息。本文将介绍帧差法的基本原理,并探讨如何利用OpenCV库实现帧差法获取运动车辆蒙版的过程。

二、实现方案

本方法通过处理视频帧,提取运动车辆的关键信息。首先,我们将视频帧转换为灰度图,以减少数据量并提高后续处理的效率。接着,我们从视频中取出中间的视频帧作为参考帧,即中位帧。然后,我们将视频中的每帧与中位帧相减,以计算出每帧与中位帧之间的差异,这些差异反映了车辆在视频中的运动情况。最后,我们对计算出的图像差异进行二值化处理,以突出显示运动车辆。通过设定合适的阈值,我们可以将差异图转换为黑白蒙版,其中白色区域表示运动车辆,黑色区域表示静止背景。通过以上步骤,我们利用帧差法获取运动车辆蒙版,并在实际应用中进行车辆检测。

三、算法实现步骤

3.1 取出视频中间帧

我们首先获取视频的总帧数。接着,我们创建一个包含25个帧索引的数组,这些索引按照时间轴顺序排列,从0到视频总帧数减1。然后,我们遍历这些帧索引,将视频流的当前位置设置到对应的帧索引,读取帧,并检查是否成功读取。如果成功,我们将帧添加到列表中。完成帧的读取和添加后,我们释放视频捕捉对象,释放资源。最后,我们计算所有帧的中值帧,作为视频的背景参考。
实现代码:

# 打开视频文件
cap = cv2.VideoCapture(r'F:\learnopencv-master\VideoBackgroundEstimation/video.mp4')
# 获取视频的总帧数
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# 生成一个按照时间轴顺序排列的帧索引数组
frameIds = np.linspace(0, total_frames-1, num=25, dtype=np.int32)
# 存储选中的帧
frames = []
# 遍历帧索引,并按照顺序存储帧
for fid in frameIds:cap.set(cv2.CAP_PROP_POS_FRAMES, fid)ret, frame = cap.read()if ret:frames.append(frame)
# 释放视频捕捉对象
# 计算中值帧
medianFrame = np.median(frames, axis=0).astype(dtype=np.uint8)

3.2 帧差法形成运动蒙版:

帧差法依赖于这样一个事实:在连续的视频帧中,静态背景在短时间内保持不变,而运动对象则会在这段时间内改变其在图像中的位置。因此,通过计算连续两帧或几帧图像之间的差异,可以检测出这些变化,从而识别出运动对象。
我们首先将计算得到的中值帧从BGR颜色空间转换为灰度图,以便后续处理。接着,我们进入一个循环,该循环会持续读取视频中的每一帧,直到视频结束。在循环中,我们首先读取当前帧,并将其从BGR颜色空间转换为灰度图。然后,我们计算当前帧与灰度中值帧的绝对差值,这个差值反映了当前帧与视频背景之间的差异。接下来,我们对差值图进行阈值处理,将差值图转换为二值图像,其中高于阈值的部分保持为白色,低于阈值的部分变为黑色。通过这个循环,我们可以实时地处理视频中的每一帧,计算出与背景的差异,并生成运动车辆的蒙版。
实现方法:

grayMedianFrame = cv2.cvtColor(medianFrame, cv2.COLOR_BGR2GRAY)# 遍历所有帧
ret = True
while(ret):# 读取当前帧ret, frame = cap.read()# 将当前帧转换为灰度图frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 计算当前帧与中值帧的绝对差值dframe = cv2.absdiff(frame, grayMedianFrame)# 进行阈值处理,将差值图二值化th, dframe = cv2.threshold(dframe, 30, 255, cv2.THRESH_BINARY)

四、代码整体实现

import numpy as np
import cv2# 打开视频文件
cap = cv2.VideoCapture(r'F:\learnopencv-master\VideoBackgroundEstimation/video.mp4')
# 获取视频的总帧数
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# 生成一个按照时间轴顺序排列的帧索引数组
frameIds = np.linspace(0, total_frames-1, num=25, dtype=np.int32)
# 存储选中的帧
frames = []# 遍历帧索引,并按照顺序存储帧
for fid in frameIds:cap.set(cv2.CAP_PROP_POS_FRAMES, fid)ret, frame = cap.read()if ret:frames.append(frame)# 释放视频捕捉对象# 计算中值帧
medianFrame = np.median(frames, axis=0).astype(dtype=np.uint8)# 将中值帧的背景重置为0
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)# 将中值帧转换为灰度图
grayMedianFrame = cv2.cvtColor(medianFrame, cv2.COLOR_BGR2GRAY)# 遍历所有帧
ret = True
while(ret):# 读取当前帧ret, frame = cap.read()# 将当前帧转换为灰度图frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 计算当前帧与中值帧的绝对差值dframe = cv2.absdiff(frame, grayMedianFrame)# 进行阈值处理,将差值图二值化th, dframe = cv2.threshold(dframe, 30, 255, cv2.THRESH_BINARY)# 显示差值图cv2.imshow('dframe', dframe)# 等待10毫秒cv2.waitKey(10)# 释放视频对象
cap.release()# 销毁所有窗口
cv2.destroyAllWindows()

五:效果

流视频中灰度图片:
在这里插入图片描述
生成蒙版图:
在这里插入图片描述

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

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

相关文章

Linux--C语言之循环结构

文章目录 一、循环结构(一)循环的概念(二)循环的类型(三)循环的构成(四)当型循环的实现while死循环 (五)for...总结死循环 (七)循环实…

机器学习——逻辑回归(学习笔记)

目录 一、认识逻辑回归 二、二元逻辑回归(LogisticRegression) 1. 损失函数 2. 正则化 3. 梯度下降 4. 二元回归与多元回归 三、sklearn中的逻辑回归(自查) 1. 分类 2. 参数列表 3. 属性列表 4. 接口列表 四、逻辑回归…

大厂面试题分享第一期

大厂面试题分享第一期 Redis持久化方式AOF优缺点RDB优缺点 如何保证Redis和Myql的一致性索引下推输入url到浏览器发生了什么ReentranLock底层原理SpringBoot 的启动流程 Redis持久化方式 Redis提供了两种主要的持久化机制,分别是AOF(Append-Only File&a…

Python 数据可视化,怎么选出合适数据的图表

数据可视化最佳实践 1. 引言:为什么数据可视化最佳实践很重要 数据可视化是数据分析和决策过程中不可或缺的一部分。通过有效的可视化,复杂的数据可以转化为易于理解的信息,从而帮助观众快速做出正确的判断。然而,糟糕的可视化可…

单片机IO灌入5V电压导致其他IO电压测量到大于供电电压问题

最近用GD32F103RCT6做项目,用了3个485收发器,都是直接接在单片机IO上的。 485收发器是5V供电的,这个时候就出现5V电平和3.3V电平兼容的问题了。 一开始只用了PA10、PC11这两个串口,他俩是兼容5V的,从手册可以看出IO最…

企业源代码也需要加密!十款好用的源代码加密软件排行榜

在当今竞争激烈的商业环境中,企业的源代码是其核心资产之一。为了保护这些宝贵的知识产权不被泄露,源代码加密成为了众多企业的重要举措。2024 年,市面上出现了众多功能强大的源代码加密软件。接下来,就让我们一同来探索十款备受好…

DockerCompose编排Nginx+Mysql并实现Nginx配置Mysql(TCP协议)负载均衡

场景 Nginx配置实例-负载均衡实例:平均访问多台服务器: Nginx配置实例-负载均衡实例:平均访问多台服务器_我想访问五个服务器的信息用nginx怎么做-CSDN博客 以上实现Nginx的http协议的负载均衡,如果使用Nginx实现TCP协议的负载…

Java的JVM中的概念之——新生代和老年代

JVM新生代和老年代是JVM中非常重要的概念,那么他们在JVM中扮演者什么样的角色和含义呢? 在Java虚拟机(JVM)的垃圾回收(GC)中,内存被分为不同的区域,其中两个主要区域是新生代&#…

PHP餐厅点餐系统小程序源码

🍽️【餐厅点餐新纪元,点餐系统让用餐更便捷!】📱 🔍 一键浏览,菜单尽在掌握 📱 走进餐厅,无需再担心找不到服务员或菜单被抢光!餐厅点餐系统让你轻松扫描桌上的二维码…

HarmonyOS Developer之图片帧动画播放器

创建image-animator组件 在pages/index目录下的hml文件中创建一个image-animator组件,css文件中编写组件样式,js文件中引用图片。 设置image-animator组件属性 添加iteration(播放次数)、reverse(播放顺序&#xf…

LVS原理及实例

目录 LVS原理 LVS概念 lvs集群的类型 lvs-nat 解释 传输过程 lvs-dr 解释 传输过程 特点 lvs-tun LVS(Linux Virtual Server)常见的调度算法 防火墙标记(Firewall Marking)结合轮询调度 实战案例 lvs的nat模式配置 …

使用Linux实现FTP云盘1

关于FTP服务器 FTP(文件传输协议)服务器是在互联网上提供文件存储和访问服务的计算机,它们依照FTP 协议提供服务。 FTP是File Transfer Protocol(文件传输协议)。 程序运行,服务端不断接收客户端指令,服务 端可同时处…

提取含有特定字符的行和列grep函数(含有替换)

目录 ①grep提取含有特定字符的列 ②grep提取含有特定字符的行 R语言进行字符的替换和删减gsub,substr函数R语言进行字符的替换和删减gsub,substr函数_r语言数据框字符替换-CSDN博客 ①grep提取含有特定字符的列 在一个dataframe中,需要提…

Element学习(axios异步加载数据、案例操作)(5)

1、这次学习的是上次还未完成好的恶element案例,对列表数据的异步加载,并渲染展示。 ——>axios来发送异步请求 (1) (2)在vue当中安装axios (注意在当前的项目目录,并且安装完之后…

Xcode 在原生集成flutter项目

笔者公司有一个从2017年就开始开发的iOS和安卓原生项目,现在计划从外到内开始进行项目迁徙。 1》从gitee拉取flutter端的代码;(Android报错Exception: Podfile missing) 2》替换Xcode里的cocopods里Podfile的路径 然后报警 然后…

Linux从0到1——进程池

Linux从0到1——进程池 1. 进程池的概念2. 进程池实现思路3. 进程池的代码实现3.1 创建管道,创建子进程3.2 封装任务3.3 Work接口3.4 发送任务3.5 回收资源,关闭管道(重点)3.6 改造CreatChannels接口 4. 完整代码 1. 进程池的概念…

ECMAScript6模板字面量:反引号、${}占位符的使用

ECMAScript 6 中引入了模板字面量,主要通过多行字符串和字符串占位符对字符串进行增强操作。如下: //使用ECMAScript6模板字面量拼接字符串,例如:2024年8月12日 15:38:28 星期一 let dateRet ${Year}年${Month}月${Dates}日 ${H…

lvs、集群

1.集群和分布式 当多个用户当用户访问一个服务器时,服务器server1可能就会崩,假如这时候我们新加一个服务器server2来缓解server1的压力,那么就需要一个调度器lvs来分配,所以现在就是用户的访问就需要通过调度器之后到达服务器&a…

简述MYSQL聚簇索引、二级索引、索引下推

一丶聚簇索引 InnoDB的索引分为两种: 聚簇索引:一般创建表时的主键就会被mysql作为聚簇索引,如果没有主键则选择非空唯一索引作为聚簇索引,都没有则隐式创建一个索引作为聚簇索引;辅助索引:也就是非聚簇索…

KillWxapkg 自动化反编译微信小程序,小程序安全评估工具,发现小程序安全问题,自动解密,解包,可还原工程目录,支持修改Hook,小程序

纯Golang实现,一个用于自动化反编译微信小程序的工具,小程序安全利器,自动解密,解包,可还原工程目录,支持微信开发者工具运行 由于采用了UPX压缩的软件体积,工具运行时可能会出现错误报告&…