MedianFlow 跟踪算法详解

news2024/11/26 22:26:22

在技术日新月异的时代,今天的技术可能在明天就会被新的技术取代,例如现在爆火的大模型。但目前看来,大模型还不能做到无所不能。

所以这篇博客还是来考古一下,写一下传统的跟踪算法。这里不是为了怼大模型而为了写一篇传统算法而写传统算法。只是觉得这个算法有个思想非常有意思,所以记录一下。

该算法在2010年发表在ICPR上,它主要是提出了Forward-Backward errors这种跟踪点的校验思想,使得跟踪点更为可靠。但博主这里认为,这篇文章其实还有一个比较有意思的一点,就是文章后面提出的MedianFlow跟踪算法,里面利用了中位数来估计待跟踪目标的位移和缩放尺度。接下来大概按照文章结构对该跟踪算法进行详细说明。

一、Forward-Backwark errors(FB errors)

从名字上可以看出,Forward-Backwark errors其实就是根据跟踪点前向和后向的结果来计算跟踪点的偏差。如下图所示:

在这里插入图片描述

从上图上半部分可以看出算法流程是这样的:

  1. 首先在第一帧输入的图片中定义需要跟踪的点,例如图中的点1和点2。为了这些点能够更稳定的被跟踪,通常会采用像Harris角点检测算法或者像FAST特征点检测算法来提取图片中特征明显的点
  2. 利用点跟踪算法,跟踪第一帧的点在第二帧的位置。通常这里会采用Lucas-Kanade稀疏光流算法
  3. 通过第2步获取到当前帧的点后,再将这些点再次利用点跟踪算法,计算出它们在前一帧的位置
  4. 利用第3步获得的前一帧的点的位置和第1步初始化的点的位置计算点的偏差,这样就得到了所谓的FB errors
  5. 根据FB errors就可以过滤掉位移较大的点,也就是跟踪失败的点

上图中的下半部分是采用符号的形式来表示这个流程:

假设目前有k的图片帧,用符号表示为 S = ( I t , I t + 1 . . . , I t + k ) S=(I_t, I_{t+1}...,I_{t+k}) S=(It,It+1...,It+k), x t x_t xt为在时刻t这一帧中待跟踪的点

  1. 采用某种点跟踪算法,跟踪点 x t x_t xt在后面k帧中的位置,这样就可以得到一条点 x t x_t xt的移动轨迹 T f k = ( x t , x t + 1 , . . . , x t + k ) T^{k}_{f}=(x_t, x_{t+1}, ..., x_{t+k}) Tfk=(xt,xt+1,...,xt+k)。这一步就称为Forward
  2. 同理根据相同的跟踪算法,将t+k帧中的跟踪点 x t + k x_{t+k} xt+k反向跟踪回第t帧,这样又可以得到一条移动轨迹 T b k = ( x ^ t , x ^ t + 1 , . . . , x ^ t + k ) T^{k}_{b}=(\hat{x}_t, \hat{x}_{t+1},...,\hat{x}_{t+k}) Tbk=(x^t,x^t+1,...,x^t+k),这里 x ^ t + k = x t + k \hat{x}_{t+k}=x_{t+k} x^t+k=xt+k
  3. FB errors用公式表示为 F B ( T f k ∣ S ) = d i s t a n c e ( T f k , T b k ) FB(T^{k}_{f}|S)=distance(T^{k}_{f}, T^{k}_{b}) FB(TfkS)=distance(Tfk,Tbk),文章为了简单定义 = d i s t a n c e ( T f k , T b k ) = ∣ ∣ x t − x ^ t ∣ ∣ =distance(T^{k}_{f}, T^{k}_{b})=||x_t-\hat{x}_t|| =distance(Tfk,Tbk)=∣∣xtx^t∣∣。也就是说FB errors文章采用初始点和反向跟踪到t帧的点之间的距离来表示

二、MedianFlow跟踪算法

MedianFlow算法是在利用上述提出的FB errors基础上获取可靠的跟踪点,进而来跟踪物体。MedianFlow跟踪算法如下图所示

在这里插入图片描述

如上图中上半部分所示,现在有两帧图片 I t I_t It I t + 1 I_{t+1} It+1,现在想利用MedianFlow算法来跟踪图中的小车。也即输入图片 I t I_t It I t + 1 I_{t+1} It+1,bounding box β t \beta_t βt,跟踪器输出 β t + 1 \beta_{t+1} βt+1

算法流程如上图中下半部分所示

  1. 根据输入的bounding box β t \beta_t βt,在框中初始化一些待跟踪点。这里的初始化方式跟第一部分所述有点不同。这里不采用角点或者特征点来初始化,而是简单的采用在框中间距相同的点作为待跟踪点
  2. 利用某种跟踪点的算法,例如Lucas-Kanade稀疏光流算法跟踪在t+1帧中点的位置
  3. 利用某种过滤算法将跟踪失败的点进行过滤,当然这里采用的就是FB errors将50%的误差较大的点进行过滤。文章其实还增加了一个叫NCC的方法(后面会做简单说明),也将误差较大的50%的点过滤掉。最终得到的点集就为跟踪到的点
  4. 利用跟踪到的点进行t+1帧bounding box的预估

上面流程中有两点需要待解释,一个是NCC,一个是bounding box的预估。下面分别做一下介绍

2.1 Normalized Cross Correlation(NCC)

从名字可以看出这里就是去求两个图之间的归一化互相关系数。

具体的对于输入的两个图 S 1 S_1 S1 S 2 S_2 S2,两张图的大小都为 m × n m\times n m×n,它们之间的互相关系数用公式表示如下:

ρ = 1 m n ∑ i = 1 m ∑ j = 1 n ( S 1 ( i , j ) − S ‾ 1 ) ( S 2 ( i , j ) − S ‾ 2 ) 1 m n ∑ i = 1 m ∑ j = 1 n ( S 1 ( i , j ) − S ‾ 1 ) 2 1 m n ∑ i = 1 m ∑ j = 1 n ( S 2 ( i , j ) − S ‾ 2 ) 2 \rho=\frac{\frac{1}{mn}\sum^m_{i=1}\sum^{n}_{j=1}(S_1(i,j)-\overline{S}_1)(S_2(i,j)-\overline{S}_2)}{\sqrt{\frac{1}{mn}\sum^m_{i=1}\sum^{n}_{j=1}(S_1(i,j)-\overline{S}_1)^2}\sqrt{\frac{1}{mn}\sum^m_{i=1}\sum^{n}_{j=1}(S_2(i,j)-\overline{S}_2)^2}} ρ=mn1i=1mj=1n(S1(i,j)S1)2 mn1i=1mj=1n(S2(i,j)S2)2 mn1i=1mj=1n(S1(i,j)S1)(S2(i,j)S2)

其中 x ‾ \overline{x} x表示求平均操作。

所以NCC操作就是两图的协方差除以两图标准差的结果,又称为Pearson相关系数。在MedianFlow两个图来源于对应跟踪点周边一定大小的图片块。

2.2 bounding box的预估

要预估一个bounding box,我们只需要预估出新的bounding box的位移以及对应的缩放尺寸。

我们通过下面两步来分别预估这两个参数

  1. 在得到可靠的跟踪点后,计算所有可靠的跟踪点的在x和y方向的移动位置,分别取x方向移动值的中位数和y方向移动值的中位数作为新的bounding box相对之前bounding box的位移
  2. 在得到可靠的跟踪点后,计算这些跟踪点两两之间的距离以及在t帧中对应点两两之间的距离,这些距离各自相除,出所有除数的中位数作为bounding box的缩放比例。

上面第2点可能有点绕,这里举个例子来说明。假设在t+1帧中,通过过滤得到的跟踪点有n个,那么对应t帧中也有n个。计算t+1帧中n个点的两两之间的距离,得到 n ∗ n n*n nn个值,同理t帧对应的点也可以得到 n ∗ n n*n nn个值,对应两帧中 n ∗ n n*n nn个值相除,得到 n ∗ n n*n nn个除数,这 n ∗ n n*n nn个除数取其中的中位数就为新的bounding box的缩放尺寸。

MedianFlow算法在opencv中是有开源代码的,可以路径https://github.com/opencv/opencv_contrib/blob/3.4/modules/tracking/src/trackerMedianFlow.cpp

参考:
  1. http://kahlan.eps.surrey.ac.uk/featurespace/tld/Publications/2010_icpr.pdf
  2. https://github.com/opencv/opencv_contrib/blob/3.4/modules/tracking/src/trackerMedianFlow.cpp

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

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

相关文章

【1++的Linux】之线程(一)

👍作者主页:进击的1 🤩 专栏链接:【1的Linux】 文章目录 一,Linux线程概念二,线程的优缺点进程和线程类比现实 三, 线程的操作线程的私有资源 && 线程的创建线程的等待线程终止线程分离…

初学Flutter:swiper实现

效果展示: flutter swiper 1、安装 card_swiper 2、引入card_swiper import package:card_swiper/card_swiper.dart;3、使用 这里我主要是对官网例子进行实践,主要是5种常用的swiper 1、普遍的swiper //custom swiper class CustomSwiper extends S…

下载安装各种版本的Vscode以及解决VScode官网下载慢的问题

下载指定版本 在Vscode官网 Vscode官网更新子页 这里的左侧栏点击其中一个会跳转到某个版本,或者在官网子页 https://code.visualstudio.com/updates的后面跟上需要的版本号即可完成目标版本下载页面的跳转 选择Linux里的ARM包不会自动下载而是跳转到另一个页面 …

vue-admin-template 安装遇到的问题

vue-element-admin 是一个后台前端解决方案,它基于 vue 和 element-ui实现。 参考文档: 官网: https://panjiachen.github.io/vue-element-admin-site/zh/guide/#%E5%8A%9F%E8%83%BD遇到的问题: npm ERR! Error while executing…

移动硬盘怎么加密?移动硬盘加密怎么设置?

在工作中,我们经常需要使用移动硬盘来保存重要数据,但是这样却不能保护重要数据的安全。所以,我们可以使用加密来保护移动硬盘。那么,移动硬盘要怎么加密呢? U盘超级加密3000 U盘超级加密3000是一款专业的移动储存设备…

Java类加载机制(类加载器,双亲委派模型,热部署示例)

Java类加载机制 类加载器类加载器的执行流程类加载器的种类加载器之间的关系ClassLoader 的主要方法Class.forName()与ClassLoader.loadClass()区别 双亲委派模型双亲委派 类加载流程优缺点 热部署简单示例 类加载器 类加载器的执行流程 类加载器的种类 AppClassLoader 应用类…

利用maven的dependency插件分析工程的依赖

dependency:analyze https://maven.apache.org/plugins/maven-dependency-plugin/analyze-mojo.html 分析项目的依赖,确定哪些:用了并且声明了、用了但没有声明、没有使用但声明了。 dependency:analyze可以单独使用,所以它总是会执行test-…

【算法练习Day38】零钱兑换完全平方数

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 零钱兑换完全平方数总结&am…

软件测试:单元测试、集成测试、系统测试详解

实际的测试工作当中,我们会从不同的角度对软件测试的活动进行分类,题主说的“单元测试,集成测试,系统测试”,是按照开发阶段进行测试活动的划分。这种划分完整的分类,其实是分为四种“单元测试,…

TablePlus for Mac 数据库管理工具功能介绍

TablePlus是一款功能强大的数据库管理工具,专为Mac操作系统设计。它支持多种主流数据库,包括MySQL,PostgreSQL,SQLite,Microsoft SQL Server,Amazon Redshift等等。无论您是开发人员、数据库管理员还是数据…

【2024最新】Android Debug Bridge【下载安装】零基础到大神【附下载链接】

一、ADB简介 1、什么是adb ADB 全称为 Android Debug Bridge,起到调试桥的作用,是一个客户端-服务器端程序。其中客户端是用来操作的电脑,服务端是 Android 设备。 ADB 也是 Android SDK 中的一个工具,可以直接操作管理 Androi…

多个PDF发票合并实现一张A4纸打印2张电子/数电发票功能

python教程79--A4纸增值税电子发票合并打印_python 打印 发票设置_颐街的博客-CSDN博客文章浏览阅读7.9k次。接上篇https://blog.csdn.net/itmsn/article/details/121902974?spm1001.2014.3001.5501一张A4纸上下2张增值税电子发票实现办法。使用环境:python3.8、ma…

【C++基础知识学习笔记】精华版(复习专用)

常用语法 函数重载(Overload) 规则: 函数名相同 参数个数不同、参数类型不同、参数顺序不同 注意: 返回值类型与函数重载无关 调用函数时,实参的隐式类型转换可能会产生二义性 默认参数 C++ 允许函数设置默认参数,在调用时可以根据情况省略实参。规则如下: 默认参数只能…

chinese_llama_aplaca训练和代码分析

训练细节 ymcui/Chinese-LLaMA-Alpaca Wiki GitHub中文LLaMA&Alpaca大语言模型本地CPU/GPU训练部署 (Chinese LLaMA & Alpaca LLMs) - 训练细节 ymcui/Chinese-LLaMA-Alpaca Wikihttps://github.com/ymcui/Chinese-LLaMA-Alpaca/wiki/%E8%AE%AD%E7%BB%83%E7%BB%86%E…

selenium自动化测试入门 —— 获取元素对象!

一、元素定位简介 八种属性定位页面元素: By.ID By.XPATH By.LINK_TEXT By.PARTIAL_LINK_TEXT By.NAME By.TAG_NAME By.CLASS_NAME By.CSS_SELECTOR webdriver元素定位方法: driver.find_element(By.XXX,元素属性) # 定位单个元素 driver.find_elemen…

按键精灵中常用的命令

1. 声明变量: Dim 2. 注释语句 (1). 单行注释:这是一行注释,使用一个单引号进行注释; (2). 单行注释:// 这是一行注释,使用一对反斜杠进行注释; (3). 多行注释:/*这是多行注释,中…

canal+es+kibana+springboot

1、环境准备 服务器:Centos7 Jdk版本:1.8 Mysql版本:5.7.44 Canal版本:1.17 Es版本:7.12.1 kibana版本:7.12.1 软件包下载地址:链接:https://pan.baidu.com/s/1jRpCJP0-hr9aI…

基于野狗算法的无人机航迹规划-附代码

基于野狗算法的无人机航迹规划 文章目录 基于野狗算法的无人机航迹规划1.野狗搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用野狗算法来优化无人机航迹规划。 1.野狗搜索算法 …

前端面试题整理(一)

前言: 这篇博客是记录自己在看面试过程中还未完全掌握的前端知识点,也是一些前端面试需要掌握的知识点(总结的并不全面,可以参考,具体情况以自己实际为准),并且这篇博客正在持续更新中… 附言&#xff1a…

2023.11.4-Envoy使用案例-oss

2023.11.4-Envoy使用案例 目录 本节实战 实战名称🚩 实战:前端代理-2023.11.2(测试成功)🚩 实战:流量镜像-2023.11.4(测试成功)🚩 实战:故障注入过滤器-2023.11.4(测试成功)🚩 实战&#xff1a…