C# 中的对象特征跟踪






4.84/5 (9投票s)
金字塔式 Kanade Lucas 光流跟踪器
![]() |
特征跟踪演示 |
目录
引言
![]() |
绝大多数计算机视觉应用除了处理单张图像外,还涉及到某种形式的视频处理分析,其中会检测和跟踪一些独特的点。我们需要跟踪特征有几个原因。
- 目标跟踪应用
- 相机图像稳定
- 三维形状重建
- 特殊电影效果
这些独特的点被称为特征点。这些点可以手动选择,也可以自动找到。如果它们是自动找到的,那么感兴趣点检测过程就称为特征点检测。特征跟踪通常在视频序列中进行,视频序列提供逐帧信息,其中目标在视频两帧之间的位置变化相对较小。这一事实以及其他一些假设使得特征点跟踪成为可能。通过跟踪多个特征并绘制特征位移向量,可以获得称为稀疏光流图像的运动图像。逐像素执行此过程,可以获得密集流图像。目前,为了实现实时性能,密集光流算法通常在 GPU 上运行。下面展示了示例。
![]() |
![]() |
稀疏光流。 | 密集光流。 |
光流算法根据其基本方法可以分为几类:基于梯度、基于相关、基于频率和基于特征。即将描述的过程称为 Kanade-Lucas-Tomassi 金字塔特征跟踪器(稀疏光流)。KLT 过程是基于梯度的过程,尽管它问世已久,但由于其简单性、合理的准确性和速度,至今仍被广泛使用。 参考文献 部分包含许多有趣的资料,供那些想了解更多信息的人参考。
光流
光流问题
光流问题是估计选定点(们)的运动向量。下图展示了这一点。有两个关键假设:
- 颜色或亮度恒定
- 帧之间的小位移
![]() |
光流问题。该图像演示了运动估计问题。 |
点的运动可以表示如下:
![]() |
通过泰勒级数近似导数,上述方程可以近似为:
![]() |
应用亮度恒定假设,起始点和位移点之间的亮度差必须等于零。或者在数学上更精确地表示为:
![]() |
有两个未知数(*u* 和 *v*),但只有一个方程。显然,为了解决光流问题,必须做出一些其他假设。这时 KLT 光流假设就派上用场了。
KLT 光流
Lucas 和 Kanade 假设运动场是平滑的。换句话说,靠近跟踪点的点以相同的方向移动。对于许多物体来说,这个假设是合理的。恒定移动区域由窗口大小确定。我们取一个 5x5 的窗口。那么我们将有 25 个方程,足以确定点的下一个位置。
![]() |
也可以做出其他假设。这就是为什么存在更多算法的原因。为了解决这个超定系统,我们最小化修改后的函数——最小二乘问题。
![]() |
请注意,*AtA* 矩阵必须是可逆的。因此,如果 *AtA* 矩阵的特征值不是太小,这个系统就是可解的。换句话说,如果该块是角点或高纹理区域。在边缘的情况下,一个特征值很大,但另一个特征值太小,这也令人不满意。
因此,为了计算单个块的 LK 光流,使用了以下过程:
- 重复直到收敛
- 计算块的水平、垂直和时间导数
- 通过求解以下方程计算位移:
(验证 *AtA* 矩阵的特征值以确定块的质量) - 根据计算出的位移扭曲块
- 获得总位移向量
金字塔扩展
在许多情况下,对象的位移比“小”还要大。如果位移很大,小位移近似(泰勒)将被违反,结果将是对象跟踪失败。为了应对这个问题,图像被缩小。缩小图像中的位移变小,算法将能够跟踪对象(假设某些其他假设没有被验证)。为了支持更大的位移,而不是只有一个缩小图像,会构建输入图像的整个高斯金字塔。
![]() |
金字塔光流过程概述。 |
实现
该实现有几个值得一提的优点:
- 支持彩色图像
光流实现还能够整合颜色信息,这可以提高跟踪鲁棒性。 - 详细的跟踪状态
该实现为每个跟踪区域提供了详细的跟踪状态(有关详细信息,请参阅KLTFeatureStatus
)。 - 实时处理
该实现经过优化,可实现实时运行。它专为实时视频处理而设计(请参阅PyrLKStorage
类)。
该实现分为三个类。主类是 LKOpticalFlow
和 KLTOpticalFlow
,它们包含计算 KLT 光流的方法。特征状态由 KLTFeatureStatus enum
确定。该实现也支持彩色图像——只需更改颜色。处理视频以避免重复计算水平和垂直导数时,使用 PyrLKStorage
类。该类充当前一帧元数据的容器。主方法 EstimateFlow
支持图像输入或存储输入。类图如下所示。
![]() |
类图。 |
简单的用法(不使用 PyrLKStorage
并省略 EstimateFlow
函数的可选参数)如下所示。
Gray<float>[,] prevIm = ...;
Gray<float>[,] currIm = ...;
PointF[] oldPositions = ...;
//use pyramidal LK flow
PointF[] currFeatures;
KLTFeatureStatus[] featureStatus;
PyrLKOpticalFlow<Gray>.EstimateFlow(prevImg, currImg, oldPositions,
out currFeatures, out featureStatus);
//write features status
for (int i = 0; i < currFeatures.Length; i++)
{
Console.WriteLine(featureStatus[i]);
}
结论
本文介绍了金字塔式 Kanade-Lucas-Tomassi 光流,它是许多计算机视觉应用的基础,例如目标跟踪、增强现实和图像稳定。代码包含完整的源代码以及特征跟踪示例。源代码和示例代码是 Accord.NET Extensions Framework 的一部分,该框架带来了许多高级算法,主要用于图像处理、目标检测和跟踪,所有这些都打包为流畅的扩展和简单直观的泛型,所以不要忘记一睹为快!
参考文献
[1] | Lucas, Bruce D., and Takeo Kanade. "An iterative image registration technique with an application to stereo vision." IJCAI. Vol. 81. 1981. 免费访问版本 |
[2] | Lucas-Kanade 运动估计 (本文档的幻灯片参考资料) |
[3] | OpenCV 教程:光流 |
历史
- 2014年11月12日 - 发布第一个版本