目标追踪——光流法optical flow

2023-05-16

光流法简介

  • 光流
    • 光流法
    • 光流的物理意义
    • 光流场
  • 光流法基本原理
  • 金字塔方法
  • 基于光流的运动目标检测(前景检测)算法
    • 实现原理

光流

光流(optical flow)是空间运动物体在观察成像平面上的像素运动的瞬时速度。

光流法

光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。

通常将二维图像平面特定坐标点上的灰度瞬时变化率定义为光流矢量,所谓光流就是瞬时速率,在时间间隔很小(比如视频的连续前后两帧之间)时,也等同于目标点的位移。

光流的物理意义

光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。当人的眼睛观察运动物体时,物体的景象在人眼的视网膜上形成一系列连续变化的图像,这一系列连续变化的信息不断“流过”视网膜(即图像平面),好像一种光的“流”,故称之为光流。光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。

三维空间内物体的运动在二维成像平面上的投影。得到的是一个描述位置变化的二维矢量,但在运动间隔极小的情况下,我们通常将其视为一个描述该点瞬时速度的二维矢量u=(u,v),称为光流矢量。

光流场

在空间中,运动可以用运动场描述,而在一个图像平面上,物体的运动往往是通过图像序列中不同图像灰度分布的不同体现的,从而,空间中的运动场转移到图像上就表示为光流场(optical flow field)。

研究光流场的目的就是为了从图片序列中近似得到不能直接得到的运动场。运动场,其实就是物体在三维真实世界中的运动;光流场,是运动场在二维图像平面上(人的眼睛或者摄像头)的投影。

光流场是一个二维矢量场,它反映了图像上每一点灰度的变化趋势,可看成是带有灰度的像素点在图像平面上运动而产生的瞬时速度场。它包含的信息即是各像点的瞬时运动速度矢量信息。
研究光流场的目的就是为了从序列图像中近似计算不能直接得到的运动场。光流场在理想情况下,光流场对应于运动场。

所谓光流场就是很多光流的集合。当我们计算出了一幅图片中每个图像的光流,就能形成光流场。构建光流场是试图重现现实世界中的运动场,用以运动分析。

光流法基本原理

  • 基本假设条件
    (1)亮度恒定不变。即同一目标在不同帧间运动时,其亮度不会发生改变。这是基本光流法的假定(所有光流法变种都必须满足),用于得到光流法基本方程;
    (2)时间连续或运动是“小运动”。即时间的变化不会引起目标位置的剧烈变化,相邻帧之间位移要比较小。
  • 基本约束方程
    考虑一个像素 I ( x , y , t ) I(x,y,t) I(x,y,t)在第一帧的光强度(其中t代表其所在的时间维度)。它移动了 ( d x , d y ) (dx,dy) (dx,dy)的距离到下一帧,用了 d t dt dt时间。因为是同一个像素点,依据上文提到的第一个假设我们认为该像素在运动前后的光强度是不变的,即: I ( x , y , t ) = I ( x + d x , y + d y , t + d t ) (1) I(x,y,t)=I(x+dx,y+dy,t+dt) \tag{1} I(x,y,t)=I(x+dx,y+dy,t+dt)(1)
    将(1)式右端进行泰勒展开
    I ( x + d x , y + d y , t + d t ) = I ( x , y , t ) + ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t + ε I(x+dx,y+dy,t+dt)=I(x,y,t)+\frac{\partial I}{\partial x}dx+\frac{\partial I}{\partial y}dy+\frac{\partial I}{\partial t}dt+\varepsilon I(x+dx,y+dy,t+dt)=I(x,y,t)+xIdx+yIdy+tIdt+ε
    其中 ε ε ε代表二阶无穷小项,可忽略不计。再将(2)代人(1)后同除 d t dt dt,可得:
    ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t = 0 (3) \frac{\partial I}{\partial x}dx+\frac{\partial I}{\partial y}dy+\frac{\partial I}{\partial t}dt=0 \tag 3 xIdx+yIdy+tIdt=0(3)
    u , v u,v u,v分别为光流分别为沿X轴与Y轴的速度矢量,得:
    u = d x d t , v = d y d t u=\frac{dx}{dt},v=\frac{dy}{dt} u=dtdx,v=dtdy
    I x = ∂ I ∂ x , I y = ∂ I ∂ y , I t = ∂ I ∂ t I_x=\frac{\partial I}{\partial x},I_y=\frac{\partial I}{\partial y},I_t=\frac{\partial I}{\partial t} Ix=xI,Iy=yI,It=tI,分别表示图像中像素点的灰度沿X,Y,T方向的偏导数。
    综上,式(3)可以写为:
    I x u + I y v + I t = 0 (4) I_xu+I_yv+I_t=0 \tag4 Ixu+Iyv+It=0(4)
    ( u , v ) (u,v) (u,v)即为所求光流矢量。
    约束方程只有一个,而方程的未知量有两个,这种情况下无法求得u和v的确切值。此时需要引入另外的约束条件,从不同的角度引入约束条件,导致了不同光流场计算方法。按照理论基础与数学方法的区别把它们分成四种:基于梯度(微分)的方法、基于匹配的方法、基于能量(频率)的方法、基于相位的方法和神经动力学方法

金字塔方法

在最开始的假设中,第一条指出点的位移应该是较小的。从上面的分析可以看出,当位移较大时,Taylor展开式一阶近似误差较大。其修正方法就是这里要介绍的金字塔方法。我们通过将图像下采样,就能够使得较大的位移在高层金字塔图像中变小,满足假设条件1.如下所示。
在这里插入图片描述

基于光流的运动目标检测(前景检测)算法

基于光流运动目标检测是在对摄像机采集到的图像序列进行重采样和去噪预处理后,利用光流法计算出各点的光流值,得出各点的光流场。然后对光流场进行阈值分割,区分出前景与背景,得到清运动目标区域。一般还会再采用形态学滤波中的开、闭运算滤除孤立噪声点,最后经过区域连通便可识别出目标区域并统计其特征信息。流程图如下:

计算输入图像的光流场
对光流场进行阈值分割
形态学滤波
光流区域分割

实现原理

使用光流法进行前景检测是是基于这样一个认识:

如果图像中没有运动目标,则光流矢量在整个图像区域是连续变化的。当图像中有运动物体时,目标和背景存在着相对运动。运动物体所形成的速度矢量必然和背景的速度矢量有所不同,如此便可以计算出运动物体的位置。
通过观察上图我们可以看到,发生运动的物体的光流矢量与背景光流矢量之间存在差异。使用阀值分割可以将整幅图片的光流矢量分成两个部分,即区分出背景与前景。阀值的选取可以使用最大类间方差法来确定。它是按图像的灰度特性,将图像分成背景和目标两部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

光流场经过阈值分割后,有一些独立的点或者有凹区域,影响了运动目标的提取。可先利用开运算,去除那些光流值与结构元素不相吻合的凹区域,同时保留那些相吻合的凹区域。然后,利用形态学滤波的闭运算,填充凹区域。

通过前面的处理,一帧图像中可能的目标区域已经成为一个可以连成一体的区域,采用合理的区域连通合并和分割技术来找出最终的目标区域。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

目标追踪——光流法optical flow 的相关文章

  • [实验一] 选择器

    该个栏目的博客都是基于南京大学的数字逻辑与计算机组成的课程设计 xff0c 方便以后进行总结归纳而准备的 这次实验是实验一 xff1a 选择器 设计一个简单的选择器 xff0c 介绍一些常用的多路选择器的设计方法 Verilog语言中的al
  • VMware虚拟机中安装的Linux系统无法识别U盘解决方法

    文章目录 1 问题描述2 解决方法3 参考文献 1 问题描述 如图1所示 xff0c 在VMware安装的Linux系统 xff08 Ubuntu 无法读取U盘 图 1 U盘读取失败 2 解决方法 原因在于所用的U盘为3 0接口 xff0c
  • 解决error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools"两个方法

    简述 在Windows下的pycharm安装出现 Microsoft Visual C 43 43 14 0 is required Get it with 34 Microsoft Visual C 43 43 Build Tools的解
  • ubuntu 18.04源码安装mysql 5.7.18

    一 安装依赖包 sudo apt update sudo apt install cmake bison libncurses5 dev build essential 二 下载 mysql 5 7 18源码 源码 传送门 选择那个包含bo
  • 什么叫做装箱和拆箱?一看就懂系列

    有很多同学对与装箱和拆箱还是有点搞不太明白 首先讲一下概念 xff1a 1 装箱指的是把值类型转化为引用类型 2 拆箱当然指的就是把引用类型转化为值类型 估计很多同学可能还分不清哪些是属于引用类型和值类型 这个就需要自己去强化记忆一下了 光
  • java 和javascript的区别?你是否还在把他们混为一谈呢

    1 javascript是基于对象的 xff0c 它是一种脚本语言 xff0c 是一种基于对象和事件驱动的编程语言 xff0c 因而它本身提供了非常丰富的内部对象供设计人员使用 而Java是面向对象的 xff0c 即Java是一种真正的面向
  • vs2019智能提示设置为中文

    官网修改中文提示地址 xff1a https docs microsoft com zh cn dotnet core install localized intellisense 1 去官网下载intellisense语言包 下载链接 x
  • .net中的定时任务

    FluentScheduler是什么 xff1f FluentScheduler是 net中的任务调度框架 xff0c 也就是你如果想在 net程序跑一段代码 xff0c 同时又不影响主程序的运行时 就可以使用FluentScheduler
  • 实用的Visual Studio插件

    打开Visual Studio 扩展 管理扩展 安装自己需要的插件 01 CodeMaid CodeMaid快速整理代码文件 xff0c 规范你的代码 xff0c 提高代码阅读体验 代码自动对齐 xff0c 格式化代码 xff08 ps x
  • mysql 数据库信息探索

    mysql 数据库信息探索 xff08 1 xff09 查询数据库的表数量 SELECT COUNT TABLES table schema FROM information schema TABLES GROUP BY table sch
  • .net 6 基于AspNetCoreRateLimit的限流

    1 安装包 AspNetCoreRateLimit 2 在appsetting cs中加入IpRateLimiting配置节点 span class token comment 限流配置 span span class token stri
  • 关于汉字转拼音并排序解决方案

    使用方法 xff1a 写一个静态帮助类 span class token keyword public span span class token keyword static span span class token keyword c
  • .NET Core6 中使用AutoMapper

    1 引入AutoMapper包 2 新建一个类 xff1a MappingProfile xff0c 类名自定义 xff0c 但是必须要继承 Profile类 用于创建映射规则 如图 xff1a Student为源数据 xff08 我这里是
  • 使用Python调用百度OCR

    使用Python调用百度OCR 注册 登录百度智能云创建应用安装python SDK接口说明代码实现 xff08 本地图片 xff09 代码实现 xff08 使用url上的图片并使用可选参数 xff09 注册 登录百度智能云 注册请点击 登
  • 001 超全C语言程序设计概念

    前言 此笔记主要参考自赵海英老师的C语言课程 xff0c 此笔记是在考研重新学习C语言的情况下进行的整理 xff0c 主要用于后续的C语言概念温故知新 第一章 基础知识 1 数制及转换 四种数制 xff1a 二进制 十进制 八进制 十六进制
  • 使用@Autowired注解警告Field injection is not recommended

    问题 xff1a 在使用变量方式依赖注入时 xff0c 提示Field injection is not recommended 64 Autowired LogService logService 虽然变量方式注入非常简洁 xff0c 但
  • mybatis动态数据源,分页插件失效

    mybatis动态数据源 xff0c 分页插件失效 发表于 xff1a 2020 08 18 20 42 47 阅读量 xff1a 9 作者 xff1a 黄叶 原因 xff1a 使用动态数据源 xff1a 数据正常但是total为0 解决
  • mybatis动态数据源配置使用事务不生效

    原因 xff1a 因为我使用的是配置的方式来加载数据源 xff0c 因此我们还需要对事务管理器进行一个配置 解决 xff1a 在代码中添加 配置事物 64 param dataSource 64 return 64 Bean public
  • Caffeine cache实现本地缓存(简单又清楚)

    Caffeine cache实现本地缓存题 缓存填充策略 手动加载 介绍 xff1a 使用方式 xff1a 同步加载 介绍 xff1a 使用方式 xff1a 异步加载 介绍 xff1a 注意 xff1a 异步和同步使用方式相似 这里的话主要
  • 商城后台系统 — 新手练习 —毕业设计

    商城后台系统 新手练习 毕业设计 业务功能介绍项目地址 xff1a 一 商品管理1 商品列表 描述 效果 2 添加商品 描述 效果 3 商品分类 描述 效果 4 商品类型 描述 效果 二 订单管理1 订单列表 描述 效果 2 订单设置 描述

随机推荐

  • CASE WHEN函数@sql学习

    mysql中可以使用CASE WHEN函数完成数据分组 CASE WHEN函数用来对数据进行判断和分组 来自MySQL触发器里的流程控制语句 知识 CASE WHEN是SQL编程中常用的条件控制语句 CASE WHEN的功能 xff1a 新
  • @Autowired注入为null — 4种常见情况

    64 Autowired注入为null 情况一 使用过滤器 原因解决 情况二 没有添加注解 原因解决 情况三 xff08 没有被扫描到 xff09 原因解决 情况四 xff08 手动new xff09 原因解决 情况一 使用过滤器 原因 因
  • TDD项目实战-命令行参数解析

    认识1 基本规则2 三步骤3 任务分解法总结 项目1命令行参数解析01 任务分解法与整体工作流程1 API 构思与组件划分2 功能分解与任务列表3 红绿灯循环 02 识别坏味道与代码重构1 引入多态接口2 使用 抽象工厂 模式的变体来替换分
  • mapper扫描问题(Invalid bound statement (not found))

    分析 xff1a 通常来说这种情况是mybatis没有配置好 但是还有一种可能是你的mapperscan扫描问题 解决 xff1a 使用这个的时候应该扫描的是mapper层 如果我们用成全局的扫描 xff08 根目录 xff09 xff0c
  • 找不到org.springframework.cloud.client.loadbalancer.reactive.OnNoRibbonDefaultCondition

    原因 xff1a 该类存在于spring cloud commons jar 引用的jar包存在冲突 新版本的spring cloud commons中取消了OnNoRibbonDefaultCondition类 解决 xff1a 引入依赖
  • Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springfra..问题

    原因 xff1a 依赖冲突 解决 xff1a 例如我的是spring cloud starter gateway和spring boot starter web和spring boot starter webflux依赖冲突排除 sprin
  • 重构 - 消除重复的new创建

    如下 xff1a 有时会遇到这种重复的new创建 span class token keyword public span span class token keyword class span span class token class
  • IDEA快捷键-重构

    文章目录 重构项目案例参考重构技巧1 消除重复new创建重构技巧2 提炼函数 xff0c 消除重复计算 提炼函数提炼变量搬移函数inlIne使用 xff08 内联 xff09 inLine重构局部变量inLine重构方法 重构重构菜单栏ID
  • 重构 - 提炼函数,消除重复代码

    一 参考资料二 重构步骤 以提炼重复计算函数为例子演示代码具体步骤1 提取重复new创建2 提取会变化的信息3 使用抽取的共有信息 xff0c 并删除原有信息4 提取计算函数5 使用卫语句 xff0c 简化代码逻辑 一 参考资料 重构 2
  • 模板方法 + 工厂变体消除重复if else

    模板方法 43 工厂消除重复if else 1 将重复代码 xff0c 抽取到抽象类中2 子类实现抽象类3 使用工厂获取对象 思维导图 xff1a 示例代码 xff1a 1 将重复代码 xff0c 抽取到抽象类中 span class to
  • mapstruct学习及使用详解

    映射器定义基本映射自定义映射方法从多个源对象映射映射嵌套对象更新现有实例继承配置逆映射映射期间的异常处理 数据类型转换隐式类型转换映射集合映射策略映射流映射枚举定义默认值或常量定义默认表达式 映射器检索策略映射定制装饰器 64 Before
  • 开窗函数@sql学习

    参考链接 https zhuanlan zhihu com p 98655285 mysql8 0 43 开窗函数 开窗函数又称OLAP函数 xff08 Online Analytical Processing xff09 1 开窗函数的语
  • LWIP学习系列(一):OSI模型以及TCP/IP模型的整理

    一 OSI模型与TCP IP模型的对比图 这张图是从网上搜来的 xff0c 我认为能够比较好的对应其中的两种模型的差别 学习lwip对其中部分协议有个大致的了解就行了 xff0c 具体需要的时候 xff0c 在按需求进行学习
  • win10 ubuntu16 双系统共用蓝牙鼠标

    最近给新笔记本电脑装了win10 43 ubuntu16双系统 xff0c 发现原来在win10下已经配对的蓝牙鼠标 xff0c 在ubuntu下配对后 xff0c win10就不能用了 xff0c 需要重新配对才行 xff0c 反之亦然
  • Validation校检使用及验证反模式问题,详细

    Validation校检认识基本使用验证 Spring MVC 控制器的输入验证 service层输入验证持久化层 实体输入使用验证组为不同的用例验证不同的对象自定义验证错误自定义验证器以编程方式验证 验证反模式 使用问题 xff09 仅在
  • Springboot使用定时任务scheduler详解

    目录 认识示例代码定时任务 调度任务开启调度添加定时任务以固定延迟执行定时任务 fixedDelay以固定速率执行定时任务 fixedRate延迟第一次初始化 initialDelay以 ISO 时间格式指定间隔 fixedRateStri
  • @Builder导致的No primary or default constructor found 问题,原因分析和解决方法

    问题 span class token class name Resolved span span class token punctuation span span class token class name span class to
  • 使用stream流的map调用set()方法提示不存在变量R的实例,因此void符合R

    示例代码 span class token keyword public span span class token class name List span span class token generics span class tok
  • 使用gitee go将spring boot项目部署到云主机上并运行

    使用 进入Gitee Go xff0c 点击免费使用 选择要做流水线的仓库 xff0c 点击免费体验 进入界面后 xff0c 点击新建流水线 构建流水线 基本信息 流水线的名称 xff0c 当执行流水后会生成一个pipeline 20220
  • 目标追踪——光流法optical flow

    光流法简介 光流光流法光流的物理意义光流场 光流法基本原理金字塔方法基于光流的运动目标检测 xff08 前景检测 xff09 算法实现原理 光流 光流 xff08 optical flow xff09 是空间运动物体在观察成像平面上的像素运