计算机视觉和滤帧技术

01 什么是计算机视觉

进入主题之前,先聊聊计算机视觉。

计算机视觉是指利用摄像头和电脑识别、跟踪和测量目标,并进行图像处理,使其适合人眼观察或仪器检测。作为一个科学学科,计算机视觉模拟生物视觉,旨在实现图像和视频的“识别”和“理解”。

  • “识别”是指通过机器学习和图像处理技术,使计算机能够识别并分类图形图像或视频中,能够对各种输入设备传入系统中的内容进行接收和分类,以特征为依据进行有效的处理。

    图片

  • 计算机视觉中的“理解”任务是试图让机器能够像人类一样理解和解释图像或视频,主要涉及到对图像或视频的测量、检测和定位。

计算机视觉通过“理解”和“识别”,模仿人类视觉系统的能力,以便能够理解和解释我们环境中的视觉信息,此能力亦使其成为许多行业和应用的关键技术。

图片

计算机视觉领域已形成相对成熟的核心技术,催生出完整的产业链,渗透到了国民经济和居民生活的方方面面。本文所谈滤帧技术是此领域的核心技术之一,通过该技术实现图像帧的筛选与过滤,目前普遍应用于视频的识别与理解。

02 滤帧技术的应用场景分析

基于视频的应用已非常广泛,特别是在公共安全方面,公安系统的”天网”即非常有代表性,假如当时现场有一套密集人群分析系统,首尔梨泰院的踩踏事件就不会发生。(可以通过对区域内单位面积人员数量进行分析)

图片

上图所示为山火监控,其实现的逻辑是通过摄像头拍摄视频完成输入,处理时将视频以时间为单位截成图像;摄像头后端通过图像识别技术来判断是否发生山火。由于山火是低频率事件,通过滤帧技术过滤重复图像,实现山火监控的同时,可节省大量计算资源。

滤帧技术的本质是通过选择或排除特定的图像帧来优化视频处理或分析任务。这种技术可以根据各种因素来筛选图像帧,包括但不限于:图像内容、场景变化程度等。滤帧技术的主要目标通常是减少需要处理的图像帧数据量,提高处理速度,以及提高后续任务(如物体检测、追踪或行为识别)的精度。滤帧技术可以看作是一种预处理步骤。

当前业界针对滤帧技术的主要诉求是根据应用场景的需要,选择关键图像帧,减少图像帧数,提取重要信息。滤帧技术的需求是如何产生的呢?

视频实际上就是一系列的图像帧(或称为“帧”),它们以特定的速率(通常是每秒24帧、30帧或60帧)连续播放。每一帧都是静态的图像,而当这些帧以足够快的速度连续播放时,由于人眼的视觉暂留效应,我们会感觉到图像在移动,就形成了动态的视频。

实际应用中,视频内容在一段时间内没有变化,视频的图像帧将出现大量的重复,这是一个非常普遍的现象。因此,过滤重复内容的图像帧,在视频识别与理解过程中显得尤为必要。

滤帧技术是如何被应用的呢?

图片

如上图所示, “视频截帧成图像帧——图像帧筛选——筛选好的图像帧进行预测和识别”构成视频识别与理解的“通常链路”,无论是识别、测量、检测还是定位,基本上都是基于该链路实现。滤帧技术在视频截帧成图像之后,主要承担了图像帧筛选。大量的实时监控场景和海量的视频数据,使得图像帧筛选成为了不可或缺的环节。

滤帧的价值在于,通过滤帧技术的预处理和筛选,可以从视频流中提取出最有用的图像帧,以满足对应的需求,同时提高效率、节省计算资源、节省存储空间。这在实时视频监控、视频摘要、视频压缩、视频索引和快速浏览等应用中很有用,对滤帧技术的探讨和研究具有重要意义。

03 滤帧技术的实现方法

针对滤帧技术的诉求主要取决于具体应用场景和需求。不同的技术和算法可用于满足不同的目标,以下总结滤帧技术的5种常用的实现方法:

帧间差分法:该技术通过比较连续帧之间的像素差异来检测图像的内容变化。通过计算当前帧与前一帧之间的差异,可以获得图像内容的变化情况。这对于剔除冗余帧图像、剔除重复帧图像和实现最优帧图像筛选非常有用。

光流估计法:光流估计是一种通过分析图像中的像素运动模式来获取运动信息的技术。具体算法包括基于亮度约束的光流方法(如Lucas-Kanade光流)、基于匹配的光流方法(如基于相关性的光流)和基于能量优化的光流方法(如Horn-Schunck光流、TV-L1光流)等。通过计算相邻帧之间的光流向量,可以获得图像中的运动信息。这对于检测和筛选具有显著运动的帧非常有用。

背景建模法:通过对视频序列进行背景分析和理解,可以识别出重要的背景变化和关键事件。背常用的算法包括高斯混合模型、自适应背景模型、基于梯度的背景建模和基于学习的背景建模。这些算法通过建立背景模型,利用像素值、梯度等信息来识别前景对象。基于背景分析的滤帧方法可以根据场景的变化情况选择关键帧。

目标检测算法:利用目标检测算法,可以识别视频中的特定目标或关键物体。通过选择包含特定目标的帧作为关键帧,可以提取出重要的内容。算法具体实现包括基于深度学习的目标检测算法(如Faster R-CNN、YOLO、SSD等)和基于传统特征的目标检测算法(如Haar特征和HOG特征结合的级联分类器)等。

运动分析法:通过分析视频序列中的运动模式和变化,可以选择具有显著运动的帧作为关键帧。常见的支持算法有运动向量分析、运动边缘检测和运动分割。运动向量分析计算像素的位移,运动边缘检测捕捉运动物体的边缘,运动分割将像素划分为运动和静止部分。这些算法可以根据应用需求选择关键帧,提取视频序列中的显著运动信息。

上述滤帧技术可以单独应用或结合使用,具体取决于应用场景和需求。根据实际情况,还可以使用其他滤波技术或自定义算法来实现特定的滤帧效果。

04 滤帧技术的实战案例分析

场景案例:某街道的占道经营实时监控

场景分析:在该场景下,需通过摄像头实时监控指定街道位置是否有小摊贩在街道上违规占道经营。该街道在下午6点至次日凌晨2点这8小时的时间段,经常出现占道经营的情况。然而,在凌晨2点到当天下午6点之间的这16小时之间,街道占道经营非常少。

技术分析:典型的视频分析类型应用,滤帧的诉求是最优帧筛,即剔除重复的截帧图像和冗余的截帧图像,筛选出图像内容有变化的截帧图像,用于识别是否有小摊贩占道经营,可选择帧间差分技术。

数据准备:选取该街道其中一路摄像头,选取2天的监控视频数据。

实现步骤

图片

图片

帧间差分技术流程引入如上图所示,图中灰色背景框内的流程即为帧间差分,帧间差分的实现,主要分为四个核心步骤:

第一步:计算前后帧差分图

首先,针对前后两帧的图像进行作差。计算方法是将当前帧与上一帧之间的绝对差异值计算出来,生成一幅差分图。这可以通过opencv库中的主函数Absdiff实现。openCV是是由Intel公司于1999年开发并在2000年首次发布的,后来由Willow Garage和Itseez等公司提供支持和贡献,这是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法的实现。差分图有助于突出图像中发生变化的区域,如下图,将差分图像转换为灰度图像。第一帧图像作为背景,没有人,第二帧图像有人出现,通过运算,得到了占道经营的整体轮廓:

图片

第二步:提取差分图的直方图

其次,针对差分图,需要提取其直方图。直方图是一种表达图像中灰度分布的方法。它的 x 轴表示图像,y 轴表示具有同一灰度值的像素点数目。通过直方图,可以对整幅图像的灰度分布有一个整体的了解。这可以通过opencv库中主函数calcHist实现。针对上述的差分图,会进行提取直方图,大部分像素值(即差值)接近于0,因此产生的差值直方图具有更大的峰值,如下图:

图片

第三步:计算直方图的均方根值

计算直方图的均方根值(RMS),以代表两张图之间的差异值。均方根值(RMS)是一种用来衡量信号幅值的度量方法,其计算过程包括先平方和,再求平均值,然后开方。RMS 值可以有效地描述图像差异程度,其计算公式如下:

图片

图片

在得到的计算结果中,RMS值越大,表示两张图像的差异程度越大。

第四步:比较阈值和差异值

最后,需要将计算出的差异值(RMS值)与预设的阈值进行比较。如果差异值大于阈值,则认为前后图像发生了变化;如果差异值小于阈值,则认为图像无变化。阈值可以根据不同场景的敏感度进行人工干预设置。阈值越小,对于图像变化(如光线、细小动作等)越敏感。

本例选用的是中敏感度识别,阈值为0.3

敏感度

阈值

0.5

0.3

0.1

注:具体阈值可根据事件在视频画面中的占比等实际场景情况设计阈值

数据比对

案例占道经营监测中,有1/3的时间存在明显的变化需要进行实时计算和分析。帧间差分技术过滤无变化的图像帧的比例为2/3。以每秒截取一帧图像的频率计算,一天的总帧数为24小时 * 3600秒/小时 = 86,400帧。根据上述比例,经过智能滤帧后,每天会被过滤掉的图像帧数为86,400帧 * (2/3) = 57,600帧。与全量参与识别计算相比,滤掉了大量的无效计算,提升了监测事件(占道经营)被发现的时效性,同时也节省了大约2/3的算力资源。

图片

通过帧间差分技术实现的智能滤帧,可以提高视频分析的效率,还能大大节省算力,这项技术对于需要实时响应和持续监测的应用场景具有重要的价值。

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

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

相关文章

郭东白的架构课学习笔笔记(1)

1.架构师的品质 自信和勇气(正确的废话)拥有战略意图,所谓战略意图,就是拥有与其资源和能力极不相称的雄心壮志。使用演绎法寻找架构原理,而不是归纳法。 2.如何提升自己的架构能力 向身边比自己厉害的优秀架构师或…

【yarn】 ‘husky install‘ fails if ‘.git‘ directory does not exists解决方法

问题描述 环境:win10 yarn 1.22.19 问题:在使用yarn安装前端依赖时,yarn install 出现错误: .git can’t be found (see https://git.io/Jc3F9) error Command failed with exit code 1. 截图 原因分析 根据设计,husky安装必…

scala学习手册

1. case class学习 样例类模式匹配 1.1 样例类(case class)适合用于不可变的数据。它是一种特殊的类,能够被优化以用于模式匹配。 case class MetaData(userId: String)case class Book(name: String) {def printBookName(): Unit {printl…

Python读取excle文件,插入到数据库

一、需求背景 最近项目实践过程中遇到了一个问题:在使用Navicat将数据导入到PostgreSQL数据库时,发现时间格式的字段中的时间数值发生了变化,导致部分数据的时间不正确,故数据手动导入数据库报错。为了解决这个问题,决…

ARM中栈的种类与运用

1. 栈的概念 栈,本身是一段内存,程序运行时用于保存一些临时数据,如局部变量、参数、返回地址等等。 学习了数据结构,对栈的概念相信大家都不陌生,后进先出的数据结构,即最后进栈的元素最先出栈。但是在C语…

(学习笔记-TCP基础知识)TCP与UDP区别

UDP UDP不提供复杂的控制机制,利用IP提供面向[无连接]的通信服务。 UDP协议非常简单,头部只有8个字节(位),UDP的头部格式如下: 目标和源端口:主要是告诉UDP协议应该把报文发给哪个进程包长度:该字段保存了…

【码银送书第二期】《高并发架构实战:从需求分析到系统设计》

很多软件工程师的职业规划是成为架构师,但是要成为架构师很多时候要求先有架构设计经验,而不做架构师又怎么会有架构设计经验呢?那么要如何获得架构设计经验呢? 一方面可以通过工作来学习,观察所在团队的架构师是如何…

栈和队列【数据结构】

1、栈 &#xff08;1&#xff09;Stack.h #pragma once #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <stdbool.h>typedef int STDataType;typedef struct Stack {STDataType* a;int top;int capacity; }ST;void STInit(ST*…

设计模式——桥梁模式

桥梁模式 定义 桥梁模式&#xff08;Bridge Pattern&#xff09;也叫做桥接模式。 将抽象和显示解耦&#xff0c;使得两者可以独立地变化。 优缺点、应用场景 优点 抽象和实现的解耦。 这是桥梁模式的主要特点&#xff0c;它完全是为了解决继承的缺点而提出的设计模式。优…

声音生成项目(6)——在矢量量化变分编码器上使用自回归模型PixelCNN模型生成新的样本

文章目录 引言PixelCNN论文简读模型介绍自回归模型PixelCNN模型结构 基础知识回顾 代码实现PixelConvLayer具体运行过程卷积模块整体网络结构 模型执行效果问题解决训练好的模型在生成新的图片时&#xff0c;为什么要逐个元素进行生成&#xff1f;掩码卷积仅仅是考虑了一部分的…

R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题

本文介绍基于R语言中的UBL包&#xff0c;读取.csv格式的Excel表格文件&#xff0c;实现SMOTE算法与SMOGN算法&#xff0c;对机器学习、深度学习回归中&#xff0c;训练数据集不平衡的情况加以解决的具体方法。 在之前的文章Python实现SMOGN算法解决不平衡数据的回归问题&#x…

Spring初识(二)

前言 经过前面的学习,我们已经知道spring就是包含了众多方法的Ioc,那么既然是容器,就具备两个功能,我们接下来就是要介绍以下两个功能: 1.将对象存储到容器(spring)中: 2.从容器(spring)中将对象取出来. 这两个功能就应发出来,spring的创建和使用. 一.Spring创建 我们先来说…

Ubuntu关闭自动休眠

一、查看当前休眠模式 使用systemctl status sleep.target 命令查看当前休眠模式&#xff0c;结果如下图&#xff0c;sleep状态为enabled&#xff0c;表示自动休眠模式开启。 二、关闭自动休眠模式 使用sudo systemctl mask sleep.target suspend.target 关闭休眠模式 三…

面向初学者的卷积神经网络

卷积神经网络在机器学习中非常重要。如果你想做计算机视觉或图像识别任务&#xff0c;你根本离不开它们。但是很难理解它们是如何工作的。 在这篇文章中&#xff0c;我们将讨论卷积神经网络背后的机制、它的优点和应用领域。 什么是神经网络&#xff1f; 首先&#xff0c;让…

【ACM】—蓝桥杯大一暑期集训Day2

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前正在学习C/C、Java、算法等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&#xff…

MySQL-分库分表详解(二)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

Xcode报错--访问keychain,出现弹窗处理方案

情景 访问keychain弹出弹窗&#xff0c;不想人工点击&#xff0c;比如自动化测试中使用keychain中的证书的情况 原因 Mac的保护机制 处理 1、人工&#xff1a;输入Password&#xff0c;点击Allow或者Always Allow 2、命令行处理 security unlock-keychain -p "<…

Spring Batch之读数据库——JdbcCursorItemReader之自定义PreparedStatementSetter(三十八)

一、自定义PreparedStatementSetter 详情参考我的另一篇博客&#xff1a; Spring Batch之读数据库——JdbcCursorItemReader&#xff08;三十五&#xff09;_人……杰的博客-CSDN博客 二、项目实例 1.项目实例 2.代码实现 BatchMain.java&#xff1a; package com.xj.dem…

docker的安装以及常用命令详解

目录 一、docker简介 二、docker安装 三、常用命令 1、显示 Docker 版本信息 2、显示 Docker 系统信息&#xff0c;包括镜像和容器数 3、帮助 四、镜像管理 1、列出镜像 2、获取一个新的镜像 3、查找镜像 4、删除镜像 5、镜像导入与导出 五、容器生命周期 1、运行…

小程序form表单验证,validate 在更新数据以后不能验证?还是提示同样的错误

报错&#xff1a; 一直报手机号码必须填写&#xff0c;但是我已经填写了。 解决&#xff1a; 花了2个小时&#xff0c;最后发布是模式models写错了。 改完之后&#xff0c;终于提示别的错误了&#xff1a; 源码&#xff1a; //wxml <view class"welcome">欢…