65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 中的对象特征跟踪

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (9投票s)

2014 年 11 月 11 日

LGPL3

5分钟阅读

viewsIcon

59435

金字塔式 Kanade Lucas 光流跟踪器

视频图标。 - 点击查看视频
Feature tracking demo.
特征跟踪演示

目录

  1. 引言
  2. 光流
  3. 实现
  4. 结论
  5. 参考文献

引言

  • NuGet 包:Vision
  • 帮助:离线 - Vision.PyramidalKLTOpticalFlow - 下载后请取消阻止!

绝大多数计算机视觉应用除了处理单张图像外,还涉及到某种形式的视频处理分析,其中会检测和跟踪一些独特的点。我们需要跟踪特征有几个原因。

  • 目标跟踪应用
  • 相机图像稳定
  • 三维形状重建
  • 特殊电影效果

这些独特的点被称为特征点。这些点可以手动选择,也可以自动找到。如果它们是自动找到的,那么感兴趣点检测过程就称为特征点检测。特征跟踪通常在视频序列中进行,视频序列提供逐帧信息,其中目标在视频两帧之间的位置变化相对较小。这一事实以及其他一些假设使得特征点跟踪成为可能。通过跟踪多个特征并绘制特征位移向量,可以获得称为稀疏光流图像的运动图像。逐像素执行此过程,可以获得密集流图像。目前,为了实现实时性能,密集光流算法通常在 GPU 上运行。下面展示了示例。

Sparse optical flow. Dense optical flow.
稀疏光流。 密集光流。

光流算法根据其基本方法可以分为几类:基于梯度、基于相关、基于频率和基于特征。即将描述的过程称为 Kanade-Lucas-Tomassi 金字塔特征跟踪器(稀疏光流)。KLT 过程是基于梯度的过程,尽管它问世已久,但由于其简单性、合理的准确性和速度,至今仍被广泛使用。 参考文献 部分包含许多有趣的资料,供那些想了解更多信息的人参考。

光流

光流问题

光流问题是估计选定点(们)的运动向量。下图展示了这一点。有两个关键假设:

  • 颜色或亮度恒定
  • 帧之间的小位移
Optical flow problem.
光流问题。该图像演示了运动估计问题。

点的运动可以表示如下:

通过泰勒级数近似导数,上述方程可以近似为:

应用亮度恒定假设,起始点和位移点之间的亮度差必须等于零。或者在数学上更精确地表示为:

有两个未知数(*u* 和 *v*),但只有一个方程。显然,为了解决光流问题,必须做出一些其他假设。这时 KLT 光流假设就派上用场了。

KLT 光流

Lucas 和 Kanade 假设运动场是平滑的。换句话说,靠近跟踪点的点以相同的方向移动。对于许多物体来说,这个假设是合理的。恒定移动区域由窗口大小确定。我们取一个 5x5 的窗口。那么我们将有 25 个方程,足以确定点的下一个位置。

也可以做出其他假设。这就是为什么存在更多算法的原因。为了解决这个超定系统,我们最小化修改后的函数——最小二乘问题。

请注意,*AtA* 矩阵必须是可逆的。因此,如果 *AtA* 矩阵的特征值不是太小,这个系统就是可解的。换句话说,如果该块是角点或高纹理区域。在边缘的情况下,一个特征值很大,但另一个特征值太小,这也令人不满意。

因此,为了计算单个块的 LK 光流,使用了以下过程:

  • 重复直到收敛
    1. 计算块的水平、垂直和时间导数
    2. 通过求解以下方程计算位移:
      (验证 *AtA* 矩阵的特征值以确定块的质量)
    3. 根据计算出的位移扭曲块
  • 获得总位移向量

金字塔扩展

在许多情况下,对象的位移比“小”还要大。如果位移很大,小位移近似(泰勒)将被违反,结果将是对象跟踪失败。为了应对这个问题,图像被缩小。缩小图像中的位移变小,算法将能够跟踪对象(假设某些其他假设没有被验证)。为了支持更大的位移,而不是只有一个缩小图像,会构建输入图像的整个高斯金字塔。

金字塔光流过程概述。

实现

该实现有几个值得一提的优点:

  • 支持彩色图像
    光流实现还能够整合颜色信息,这可以提高跟踪鲁棒性。
  • 详细的跟踪状态
    该实现为每个跟踪区域提供了详细的跟踪状态(有关详细信息,请参阅 KLTFeatureStatus)。
  • 实时处理
    该实现经过优化,可实现实时运行。它专为实时视频处理而设计(请参阅 PyrLKStorage 类)。

该实现分为三个类。主类是 LKOpticalFlowKLTOpticalFlow,它们包含计算 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日 - 发布第一个版本
© . All rights reserved.