热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

金字塔LucasKanada特征(光流)跟踪算法——翻译/学习-笔记(1)

源论文:PyramidalImplementationoftheLucasKanadeFeatureTrackerDescriptionofthealgorithm1

源论文:Pyramidal Implementation of theLucas Kanade Feature Tracker Description of the algorithm

1.   问题描述

I和J分别表示两幅灰度图。I(x) = I(x, y) 和J(x) = J(x, y)分别是两幅图像上位置为[x, y]T处像素点x的灰度值,xy分别为该点的像素坐标。令I为第一幅图像,J为第二幅图像。在实际中,图像I和J分别是离散化函数或者矩阵,左上角的像素坐标为[0, 0]T。n­­x和ny表示两幅图像的宽和高,基于左上角的像素坐标可以得到右下的像素坐标为[nx-1, ny-1]T

对于第一幅图像上的图像点u = [ux,uy]T, 特征跟踪的目的便是在第二幅图像上找到使得I(u)和J(v)相似的点v = u + d = [ux+dx, uy+dy]T的具体位置。向量d = [dx, dy]T为图像在x点处的速度(准确来讲,应该是位移),也称为x点处的光流。因为孔径问题的存在,需要在一个2D邻域去定义相似关系。 ω_x和ω_y分别为两个整数,定义以图像位移d为向量的最小化误差函数为:


由上面函数可见,度量相似性的误差函数基于图像中大小为(2ω_x+1)*(2ω_y+1)的邻域块进行测量。此邻域也称为集成窗口,ω_x和ω_y一般取2,3,4,5,6,7个像素大小。

2.   跟踪算法

对于任何一个关键点跟踪,其有两个衡量指标:精度和鲁棒性。精度和负责跟踪的局部子像素位置精度有关。很明显,为了不平滑掉图像的细节信息,小的集成窗口更加适合,也就是小的ω_x和ω_y 取值(因为窗口越大,特征点附近的细节信息越会被平滑稀释掉)。在图像中的阻塞区域尤其要求比较小的窗口,因为那里可能不同点在两个路径中移动的速度不同(空间点和相机间的距离不同,相同的相机运动下像素点移动的速度和位移也不同)。

鲁棒性和不同的光度、图像运动的下追踪的敏感度有关。尤其是,为了处理大幅的运动,直观上选择一个大的集成窗口显然更有优势。确实,如等式(1)所示,令d_x≤ω_x且d_y≤ω_y是一种更加合适的参数选择方法(除非有可用的先验匹配信息)。所以说,选择集成窗口大小的时候,在局部精度和鲁棒性间的需要有一个权衡。为了解决这个问题,论文作者提出了一种基于经典Lucas-Kanade算法的金字塔实现方法。还利用迭代LK光流计算方法实现了更高的局部跟踪精度。

2.1   图像金字塔的建立

大小为nx*ny的图像I的金字塔结构可通过下面方法建立:I0=I表示第0th层的图像,此图像的分辨率最高(原始图像),其宽度和高度也和原始图像一致n0x­=nx,n0y­=ny。接着,金字塔结构以一种递归的方式建立:基于I0计算I1,接着基于I1计算I2…。令L=1,2…作为金字塔的其中一层,令IL-1表示在L-1层的图像。n_x^(L-1)和n_y^(L-1)分别为I^(L-1)的宽度和高度。图像IL-1的灰度值可以由下式进行计算:


简单起见,基于下列各式计算图像IL-1中边缘附近的像素点值:


由等式2可见,2x和2y的范围为[0, n_x^(L-1)-1]和[0, n_y^(L-1)-1 ]。所以,IL图像的宽度和高度分别需要满足下面约束:


基于等式(2)、(3)和(4)递归地构建I和J两幅图像的金字塔结构(L=0…Lm)。Lm为金字塔的高度(可以自己根据需要选择)。比如:大小为640*480的图像I,其I1、I2、I3和I4大小分别为320*240、160*120、80*60和40*30。大部分情况下金字塔高于4层没太大意义。金字塔结构主要是为了解决大像素运动,也就是比集成窗口还大的运动。所以金字塔的高度也需要根据实际中光流运动的最大值去选择。等式(2)中建议在二次采样之前利用低通滤波器[1/4 1/2 1/4]*[1/41/2 1/4]T对图像进行抗锯齿操作。在实际中(比如C代码中),建立金字塔时会采用更大的一个抗锯齿滤波器[1/16 1/43/8 1/4 1/16] * [1/16 1/4 3/8 1/4 1/16]T

2.2   金字塔特征跟踪

特征跟踪的目的是:对于一个给定的图像I中的点u,找到图像J中与之对应的位置v=u+d,或者是找到该点的像素位移向量d(参见等式(1))。

对于L=0…L­m,定义金字塔图像IL中点u对应的坐标uL=[uLx uLy]。基于上一部分中等式(2)、(3)和(4),可得向量uL可以通过下式计算:

上述的除法操作独立应用于每一层金字塔图像的的坐标计算中(子等式中就是连乘的操作)。当L=0时,可见u0=u。

金字塔跟踪算法的整体处理流程如下:首先,在最顶层Lm计算光流;接着,基于上一层计算的结果得到Lm-1层像素位移的初始估计值。基于此初始估计值,在Lm-1层计算定义的光流,而且接着此结果被传递到下一层Lm-2,依次传递知道第0层(也就是原始图像)。

下面用数学公式描述L+1和L层间的递推关系。假设在L层的初始光流位移估计值为gL=[gLx, gLy]T,该估计值从顶层Lm一直递推到上一层L+1。接着,为了计算L层的光流,通过对这层的图像建立最小化误差匹配函数求解残余像素位移dL=[dLx, dLy]T(相当于在上一层的位移基础上进一步求解更加精确的像素位移,最终的位移需要累加顶层到底层的位移):


所有L层的集成窗口大小均为(2 +1)*(2 +1)。每一层中的光流初始位移估计值gL在图像J中可以对像素的移动路径进行预移动(相当于移动路径的预处理)。这样的话,光流的残余位移向量dL=[dLx , dLy]T会是一个比较小的量,这样可以更加容易的利用标准的LK方法进行计算。

残余光流位移dL的计算在下一部分详述,先假设这个向量dL已经被计算过了。接着,L层的计算结果dL会通过下一层的初始位移估计值gL-1被传递到L-1层,表达式如下:


最终的光流移动计算结果d(参考等式(1))可通过金字塔最底层的图像(L=0)计算得到:

上式也可以进一步写为:

金字塔结构的明显优势在于对于一个比较大的像素位移L,可以将其逐步分解为多个比较小的残余光流位移dL进行计算。假设每一次基本的光流计算可以处理的最大像素运动是dmax,那么基于金字塔结构可以处理的整个像素运动最大值为dmax_final=(2Lm+1-1)dmax。每多加一层结构L,就要多加下一层L-1最大处理像素运动位移的两倍。最终可以处理的最大像素运动位移是所有层可处理的最大运动的累加值。这个可以通过下面的表格理解:

层数

该层可处理的最大位移

该金字塔结构可处理的最大位移

倍数/增益(与非金字塔结构算法相比)

L0

dmax

dmax

1

L1

2dmax

L0+L1=3dmax

3

L2

4dmax

L0+L1+L2=7dmax

7

L4

8dmax

L0+L1+L2+L3=15dmax

15

也就是说,如果金字塔的高度为3,即Lm=3,则金字塔LK光流跟踪算法可处理的最大像素运动位移是标准LK光流跟踪算法可处理最大位移的15倍。这能够在不增大集成窗口大小的情况下,有效处理大幅的像素运动,这样较好的兼容了特征跟踪鲁棒性和精度。




















推荐阅读
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 本文介绍了一种求解最小权匹配问题的方法,使用了拆点和KM算法。通过将机器拆成多个点,表示加工的顺序,然后使用KM算法求解最小权匹配,得到最优解。文章给出了具体的代码实现,并提供了一篇题解作为参考。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了源码分析--ConcurrentHashMap与HashTable(JDK1.8)相关的知识,希望对你有一定的参考价值。  Concu ... [详细]
  • AstridDAO 专访:波卡稳定币黑马 BAI
    加入Pol ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了VoLTE端到端业务详解|VoLTE用户注册流程相关的知识,希望对你有一定的参考价值。书籍来源:艾怀丽 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
author-avatar
fst123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有