0

我正在研究这个领域以实时获得对象检测。

视频示例:

但是他们怎么能如此快地提取筛选关键点并匹配它们呢?
SIFT 提取通常需要一秒钟

4

3 回答 3

4

我是一名 OpenIMAJ 开发人员,负责制作第一个视频。

我们并没有做任何特别花哨的事情来使该视频中的匹配速度更快,并且对每一帧的整体进行 SIFT 检测和提取。事实上,视频在我们进行任何优化之前就已经制作好了;该演示的当前版本更加流畅。我们也有一个带有混合 KLT-tracker 的版本,由于不必在每一帧上执行 SIFT,它的工作速度更快。

正如@Mario 所建议的那样,图像大小确实对提取速度有很大影响,因此处理较小的帧可以带来很大的好处。其次,在Lowe在SIFT论文中提出的高斯兴趣点定位的差异的原始描述中,建议首先将输入图像的尺寸增加一倍以增加特征数量。通过不执行这种双倍调整,您还可以获得性能大幅提升,但要匹配的功能更少。

该代码是开源的(BSD 许可证),您可以通过http://www.openimaj.org上的链接获得它。如视频描述中所述,图像处理代码是纯 Java;唯一的本机代码是网络摄像头的精简接口。当前教程 pdf 文档中的教程编号 7介绍了在 OpenIMAJ 中使用 SIFT 的过程。禁用双重大小可以通过执行以下操作来实现:

DoGSIFTEngine engine = new DoGSIFTEngine();
engine.getOptions().setDoubleInitialImage(false);
于 2012-06-25T22:28:26.723 回答
2

SIFT 可以通过多种方式加速:

  • 如果你能负担得起近似值,那么你可以推导出一个名为 SURF 的关键点,它的速度更快(对大多数任务使用积分图像)

  • 您可以在 CPU 级别(例如 OpenCV 使用 Intel 的 TBB)或 GPU 级别(google for sift gpu 获取相关代码和文档)使用并行实现。

无论如何,这些在 Java 中都不可用(AFAIK),因此您必须使用 Java 包装器来 opencv 或自己解决。

于 2012-06-19T10:42:21.023 回答
2

一般和第一个想法:询问视频上传者。我们可以假设完成了什么或如何完成。了解您迄今为止所做的工作也可能会有所帮助(例如,您的视频分辨率、处理能力、图像准备等)。

我没有专门使用过 SIFT,但在过去的几年里我做了很多对象/运动跟踪,所以这更笼统。你可能已经尝试了一些点,我不知道。

  • 降低图像分辨率:从 640x480 到 320x240 会将数据减少到 25%。降低到 160x120 将再减少 25%(因此剩下 6.25% 的数据),而不会显着影响您的算法。
  • 以类似的方式,降低图像的颜色深度可能很有用(不仅仅是 256 灰度,甚至可能更多;比如 64 色)。
  • 尝试其他方法使特征更明显或更快地找到,例如尝试在图像上运行边缘检测器。
  • 至少第二个视频提到了一个跟踪系统,所以你可以尝试猜测被跟踪对象应该在下一帧重新出现的区域(使用一些简单的 a/b 过滤器或任何坐标和可能的旋转),然后在那个子上使用 SIFT区域(有一些额外的边距)。如果您无法再次找到它,请仅分析整个图像。在第二个视频中大约 40 或 50 秒时,他们正在丢失对象并且需要相当长的时间/尝试再次找到它。
于 2012-06-19T10:42:47.993 回答