一、KLT(Kanade--Lucas--Tomasi)跟踪原理
1. 目标
给定第 1 帧某些点
p=(x,y) \mathbf{p}=(x,y) p=(x,y)
求它在第 2 帧的位置
p′=(x+u, y+v) \mathbf{p}'=(x+u,\;y+v) p′=(x+u,y+v)
从而得到一条短轨迹。
2. 核心假设:亮度恒常
I(x,y,t)=I(x+u, y+v, t+Δt) I(x,y,t)=I(x+u,\;y+v,\;t+\Delta t) I(x,y,t)=I(x+u,y+v,t+Δt)
符号含义:
| 符号 | 含义 |
|---|---|
| I(x,y,t)I(x,y,t)I(x,y,t) | 时刻 ttt 时图像在像素 (x,y)(x,y)(x,y) 处的灰度值 |
| uuu | 该点在 xxx 方向的像素位移(不是速度) |
| vvv | 该点在 yyy 方向的像素位移 |
| Δt\Delta tΔt | 两帧之间的时间间隔 |
3. 一阶泰勒展开 → 光流约束方程
对右边做一阶泰勒展开:
I(x+u,y+v,t+Δt)≈I(x,y,t)+Ixu+Iyv+ItΔt I(x+u,y+v,t+\Delta t) \approx I(x,y,t)+I_x u+I_y v+I_t \Delta t I(x+u,y+v,t+Δt)≈I(x,y,t)+Ixu+Iyv+ItΔt
令两边相等,消去 I(x,y,t)I(x,y,t)I(x,y,t),再除以 Δt\Delta tΔt:
Ixu+Iyv+It=0 I_x u + I_y v + I_t = 0 Ixu+Iyv+It=0
符号:
| 符号 | 含义 |
|---|---|
| Ix=∂I∂xI_x=\dfrac{\partial I}{\partial x}Ix=∂x∂I | 图像在 xxx 方向的灰度梯度 |
| Iy=∂I∂yI_y=\dfrac{\partial I}{\partial y}Iy=∂y∂I | 图像在 yyy 方向的灰度梯度 |
| It=∂I∂tI_t=\dfrac{\partial I}{\partial t}It=∂t∂I | 同一像素随时间的变化率 |
| u,vu,vu,v | 未知:像素在两帧间的位移 |
⚠️ 一个像素只有一个方程,却有两个未知数 (u,v)(u,v)(u,v) → 孔径问题。
补充: 除以 Δt\Delta tΔt u v 为什么没有变化?

4. Lucas--Kanade 的解决办法:局部窗口内运动相同
在特征点周围一个窗口 W\mathcal WW 里,假设所有像素有相同位移 (u,v)(u,v)(u,v)。
对窗口内第 iii 个像素:
Ix,iu+Iy,iv=−It,i I_{x,i} u + I_{y,i} v = -I_{t,i} Ix,iu+Iy,iv=−It,i
写成矩阵:

其中
A=Ix,1Iy,1Ix,2Iy,2⋮⋮Ix,NIy,N,b=−It,1−It,2⋮−It,N A= \begin{bmatrix} I_{x,1} & I_{y,1}\\ I_{x,2} & I_{y,2}\\ \vdots & \vdots\\ I_{x,N} & I_{y,N} \end{bmatrix}, \quad \mathbf b= \begin{bmatrix} -I_{t,1}\\ -I_{t,2}\\ \vdots\\ -I_{t,N} \end{bmatrix} A= Ix,1Ix,2⋮Ix,NIy,1Iy,2⋮Iy,N ,b= −It,1−It,2⋮−It,N
N=∣W∣N=|\mathcal W|N=∣W∣ 是窗口内像素个数。
最小二乘解:

而
A⊤A=∑Ix2∑IxIy∑IxIy∑Iy2 A^\top A= \begin{bmatrix} \sum I_x^2 & \sum I_x I_y\\ \sum I_x I_y & \sum I_y^2 \end{bmatrix} A⊤A=∑Ix2∑IxIy∑IxIy∑Iy2
这个矩阵叫 结构张量 / Hessian。
5. "好跟踪点"怎么选(Shi--Tomasi)
对上面矩阵求特征值 λ1≥λ2\lambda_1\ge \lambda_2λ1≥λ2:
| 情况 | 含义 |
|---|---|
| λ1,λ2\lambda_1,\lambda_2λ1,λ2 都大 | 角点,两个方向都可观,好跟踪 |
| 一个大一个小 | 边缘,沿边缘不可观 |
| 两个都小 | 平地,没东西可跟 |
准则:
min(λ1,λ2)>τ \min(\lambda_1,\lambda_2)>\tau min(λ1,λ2)>τ
τ\tauτ 是阈值。
6. 金字塔 KLT(Pyramidal KLT)
原始 LK 只能跟几像素。大运动做法:
- 建高斯金字塔 ILI^LIL,L=0L=0L=0 是原图,LLL 越大越粗
- 在粗层先估一个大概位移 gL\mathbf g^LgL
- 在细层算残差位移 dL\mathbf d^LdL
- 向上传播:
gL−1=2(gL+dL) \mathbf g^{L-1}=2(\mathbf g^L+\mathbf d^L) gL−1=2(gL+dL)
最终位移:
d=g0+d0 \mathbf d = \mathbf g^0+\mathbf d^0 d=g0+d0
符号:
| 符号 | 含义 |
|---|---|
| LLL | 金字塔层数,L=0L=0L=0 最细 |
| gL\mathbf g^LgL | 第 LLL 层的初始位移猜测 |
| dL\mathbf d^LdL | 第 LLL 层算出的残差位移 |
| d\mathbf dd | 原图尺度下的总像素位移 |
👉 OpenCV 的 calcOpticalFlowPyrLK 就是这套。
7. KLT 得到的"点轨迹"
对点 kkk:
pk(t0), pk(t1), ...,pk(tT) \mathbf p_k(t_0),\; \mathbf p_k(t_1), \;\dots, \mathbf p_k(t_T) pk(t0),pk(t1),...,pk(tT)
如果前向--后向不一致、出界、残差太大,就判为丢失。
二、KLT 优缺点
KLT(Kanade--Lucas--Tomasi)光流是一种基于局部窗口亮度恒定假设的经典特征跟踪算法,常用于运动估计、视频稳定、SLAM 与目标跟踪等领域。
优点
-
计算高效、速度快
只需求解一个小窗口内的线性方程组(Lukas--Kanade 法),无需迭代求解全场稠密光流,适合实时应用。
-
精度高(对小运动、纹理丰富区域)
在局部平移小位移假设下,KLT 有解析解,亚像素级精度容易达到;Tomasi 还证明了选择"特征性好"的角点可以显著提高跟踪稳定性。
-
只跟踪稀疏特征点,开销可控
与稠密光流(如 Horn--Schunck、Farneback、深度学习方法)相比,KLT 只处理角点(Shi--Tomasi 特征),数据量小,适合嵌入式和实时系统。
-
配合金字塔可处理较大运动
通过图像金字塔由粗到精跟踪(pyramidal KLT),可以突破"小运动"假设,兼顾大范围位移和精度。
-
特征筛选机制(良角点判别)
利用 Hessian 矩阵特征值判断角点质量,只保留纹理好、可跟踪的特征点,减少漂移和误匹配。
缺点
-
依赖小运动假设
亮度恒定 + 空间一致性都是强假设。目标快速运动、大位移时(无金字塔时)容易失效。
-
对光照变化敏感
亮度恒定在真实场景中常被破坏(阴影、曝光变化、高光反射),导致跟踪漂移。
-
在弱纹理/重复纹理区域表现差
平坦区域缺乏梯度信息,方程矩阵接近奇异,无法求解;棋盘格等重复纹理容易产生误匹配。
-
遮挡和出界问题
特征被遮挡或移出画面时,跟踪会失效;通常需要 RANSAC、前后向误差检查(forward-backward error)等手段剔除坏点。
-
难以处理非刚性形变
KLT 假设窗口内为刚体平移,物体旋转、缩放、形变较大时误差明显,可能丢失跟踪。
适用场景与对比小结
| 场景 | 表现 |
|---|---|
| 快速运动、光照变化大 | 较差(需配金字塔、光度归一化) |
| 刚体目标、纹理清晰 | 很好,实时首选 |
| 需要稠密运动场 | 不适合,应选稠密光流或 RAFT 等深度学习法 |
| 长时跟踪 | 需配合重检测、误匹配剔除机制 |
总体而言,KLT 是"稀疏、快速、精度高"的经典选择,核心短板在于小运动与亮度恒定假设,工程中通常与金字塔、RANSAC、特征重检测组合使用。