OpenCV - 特征匹配与光流

时间:2017-11-24 02:31:52

标签: opencv computer-vision

我有兴趣使用OpenCV制作动作跟踪应用程序,并且在线提供了大量信息。然而,使用诸如Lucas-Kanade之类的稀疏光流算法,我在特征匹配和跟踪特征之间有点混淆。考虑到这一点,我有以下问题:

  • 如果我指定了要跟踪的像素区域,那么两者(特征匹配和光流)之间的主要区别是什么?我对实时跟踪不感兴趣,如果这有助于澄清任何假设。

  • 此外,由于我没有进行实时跟踪,使用密集光流(Farneback)来跟踪我指定的感兴趣区域中的像素是否更好?

谢谢。

3 个答案:

答案 0 :(得分:13)

我想补充一些关于这个主题的想法,因为我发现这也是一个非常有意义的问题。 如上所述特征匹配是一种基于以下的技术:

  • 功能检测步骤,它会返回一组所谓的要素点。这些特征点位于具有显着图像结构的位置,例如,如果您使用SIFT或SURF,则在使用FAST或类似blob的结构时会出现类似边缘的结构。

  • 第二步是匹配。从两个不同图像中提取的特征点的关联。匹配基于本地视觉描述符,例如,梯度或二进制模式的直方图,在特征位置周围局部提取。描述符是特征向量,并且关联的特征点对是最小特征向量距离对。

大多数功能匹配方法是 scale rotation 不变,并且对于照明的变化是健壮的(例如引起的)通过阴影或不同的对比度)。因此,这些方法可以应用于图像序列,但更常用用于对齐图像对从不同视图或不同设备进行处理。不利之处特征匹配方法难以定义特征匹配的产生位置以及特征对(在图像序列中是运动矢量)通常非常稀疏。此外,匹配方法的亚像素精度非常有限,因为大多数检测器都被精细分级到整数位置。

根据我的经验,特征匹配方法的主要优势是他们可以计算非常大动作/位移

OpenCV提供了一些功能匹配方法,但是有很多更新,更快,更准确的在线方法,例如:

  • DeepMatching依赖深度学习,常用于初始化光流方法,以帮助他们处理远程动作。
  • Stereoscann这是一种非常快速的方法,其目的是提出视觉测距法。
相比之下,

光流方法依赖于亮度恒定性的最小化和附加约束,例如,因此,它们基于一系列连续帧的空间和时间图像梯度导出运动矢量。因此,它们更适合图像序列,而不是从非常不同的视点捕获的图像对。用光流向量估算运动的主要挑战大运动遮挡强烈的光照变化对象外观的变化和mostyl 低运行时间。然而,光流方法可以高度精确和计算密集运动场,它们共享场景中对象的运动边界。

然而,不同光流方法的准确性是非常不同的。诸如PLK(Lucas Kanade)之类的局部方法通常不太准确,但仅允许计算预先选择的运动矢量,因此可以非常快。 (近年来,我们已经做了一些研究来提高本地方法的准确性,请参阅here以获取更多信息)。

OpenCV 主干提供全局方法,例如Farnback。但这是一种安静的过时方法。尝试 OpenCV contrib 主干,这更多地是方法。但为了更好地了解最新方法,请查看公共光流基准。在这里,您将找到代码和实现,例如:

但是从我的观点来看,我不会在早期阶段拒绝特定的方法匹配或光流。尽可能多地尝试在线实施,看看什么是最适合您的应用程序。

答案 1 :(得分:7)

特征匹配使用特征描述符在特征描述符空间中使用最近邻搜索来匹配特征(通常)。基本思路是你有描述符向量,两个图像中的相同特征应该在描述符空间中彼此靠近,所以你只需要匹配那样。

光流算法不会查看描述符空间,而是查看要素周围的像素块并尝试匹配这些块。如果您熟悉密集的光流,稀疏的光流就会产生密集的光流,但是在特征点周围的图像的小片上。因此,光流假设亮度恒定,即像素亮度在帧之间不变化。此外,由于您要查看相邻像素,因此您需要假设您的要素的相邻点与您的要素的移动方式类似。最后,由于它在小块上使用密集流算法,因此它们移动的点在原始特征位置的图像中不能很远。如果是,则建议使用金字塔分辨率方法,在此之前缩小图像,然后执行此操作,以便曾经是16像素的平移现在是2像素平移,然后您可以使用找到的变换向上扩展你的先前。

因此,当使用比例不完全相同的模板,或者如果图像和模板中存在透视差异,或者转换是否存在时,特征匹配算法总体上要好得多。大。但是,您的匹配仅与您的特征检测器完全一样好。在光流算法上,只要它在正确的位置看,转换就可以真正,非常精确。它们的计算成本都很高;光流算法是一种迭代方法,因此它们很昂贵(尽管您认为金字塔方法可以通过运行更多图像来消耗更多成本,但实际上它可以在某些情况下使其更快以达到所需的精度),并且最近邻搜索也很昂贵。光流算法当转换很小时,OTOH可以很好地工作,但如果你的场景中的任何东西与你的灯光混淆,或者你得到一些不正确的像素(比如说,即使是轻微的遮挡)也真的可以把它扔掉。

使用哪一个肯定取决于项目。对于我使用卫星图像进行的项目,我使用了密集的光流,因为我正在使用的沙漠地形图像没有足够精确的特征(位置),并且不同的特征描述符看起来相对相似,因此搜索特征空间不是#39;给出了大量的精彩比赛。在这种情况下,光流是更好的方法。但是,如果您在城市的卫星图像上进行图像对齐,而建筑物可能会遮挡部分场景,则会有许多功能保持匹配并提供更好的效果。

OpenCV Lucas-Kanade tutorial并没有提供很多见解,但应该考虑到上述内容,让您的代码朝着正确的方向前进。

答案 2 :(得分:3)

关键点匹配=稀疏光流

KLT跟踪是稀疏流的一个很好的例子,请参阅演示LKDemo.cpp(它也有一些python包装器示例,现在无法记住)。

有关密集示例,请参阅samples / python / opt_flow.py,使用Farnebäcks方法。

你对此感到困惑......整个世界都对这个非常简单的话题感到困惑。很多原因是因为人们认为Lucas-Kanade是稀疏流(由于openCV中一个非常严重的命名和注释的例子:LKdemo应该被称为KLTDemo)。