我正在研究这个领域以实时获得对象检测。
视频示例:
但是他们怎么能如此快地提取筛选关键点并匹配它们呢?
SIFT 提取通常需要一秒钟
我正在研究这个领域以实时获得对象检测。
视频示例:
但是他们怎么能如此快地提取筛选关键点并匹配它们呢?
SIFT 提取通常需要一秒钟
我是一名 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);
SIFT 可以通过多种方式加速:
如果你能负担得起近似值,那么你可以推导出一个名为 SURF 的关键点,它的速度更快(对大多数任务使用积分图像)
您可以在 CPU 级别(例如 OpenCV 使用 Intel 的 TBB)或 GPU 级别(google for sift gpu 获取相关代码和文档)使用并行实现。
无论如何,这些在 Java 中都不可用(AFAIK),因此您必须使用 Java 包装器来 opencv 或自己解决。
一般和第一个想法:询问视频上传者。我们可以假设完成了什么或如何完成。了解您迄今为止所做的工作也可能会有所帮助(例如,您的视频分辨率、处理能力、图像准备等)。
我没有专门使用过 SIFT,但在过去的几年里我做了很多对象/运动跟踪,所以这更笼统。你可能已经尝试了一些点,我不知道。