Lucas-Kanade(LK)算法原理介绍及OpenCV代码实现分析

Lucas-Kanade跟踪算法是视觉跟踪中一个很经典的基于点的逐帧跟踪算法。起初这个算法是用来求解stero matching1的,后来经过Carlo Tomasi2和Jianbo Shi3等人的发展渐趋成熟。Jianbo Shi提出了一种筛选跟踪点特征的方法,使得特征的跟踪更可靠。Jean-Yves Bouguet4详细阐述了如何采用金字塔方式实现LK算法以处理两帧之间特征点位移较大的情况。

问题阐述

首先我们来看一下我们要解决的问题是什么?LK算法是基于特征点的跟踪,而这里的特征点就是每个点对应的一个小窗口图像块,LK所要解决的是求解连续两帧图像相同特征点的位移问题。这里我们假设\(I\)\(J\)为连续两帧图像,其\((x,y)\)点的灰度值分别对应\(I(x,y), J(x,y)\)。设\(\mathbf{u}=[u_x,u_y]^T\)是图像\(I\)上一点,LK算法的目标是在图像\(J\)找到一点\(\mathbf{v}= \mathbf{u} + \mathbf{d} = [u_x+d_x,u_y+d_y]^T\)使得点\(I(\mathbf{u})\)和点\(J(\mathbf{v})\)是同一个位置。为了求解这样的点,LK求解这两个点对应的小窗口内像素的相似度。设\(\omega_x\)\(\omega_y\)分别是点左右扩展的窗口范围,这样我们可以定义如下residual function为

\[\epsilon(\mathbf{d})=\epsilon(d_x,d_y)=\sum_{x=u_x-\omega_x}^{u_x+\omega_x}\sum_{y=u_y-\omega_y}^{u_y+\omega_y}(I(x,y)-J(x+d_x,y+d_y))^2\]

窗口大小为\((2\omega_x+1)\times (2\omega_y+1)\),通常情况下\(\omega_x\)\(\omega_y\)的值为2,3,4,5,6,7。

Read More