实时物体检测(筛选)?

时间:2012-06-19 10:13:29

标签: java c++ image-processing opencv

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

视频示例:

但他们怎样才能提取筛选关键点并快速匹配它们呢? SIFT提取通常需要第二次

3 个答案:

答案 0 :(得分:4)

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

我们没有做任何特别想要在该视频中快速匹配的事情,并且SIFT检测和提取是在每一帧的整个过程中进行的。事实上,在我们进行任何优化之前,视频已经完成;该演示的当前版本更加顺畅。我们还有一个带有混合KLT跟踪器的版本,无需在每一帧上执行SIFT,工作速度更快。

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

代码是开源的(BSD许可证),您可以通过http://www.openimaj.org上的链接获取它。如视频描述中所述,图像处理代码是纯Java;唯一的本机代码是网络摄像头的瘦接口。 current tutorial pdf document中的第7号教程介绍了在OpenIMAJ中使用SIFT的过程。通过执行以下操作可以禁用双倍大小:

DoGSIFTEngine engine = new DoGSIFTEngine();
engine.getOptions().setDoubleInitialImage(false);

答案 1 :(得分:2)

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

  • 如果你能买得起近似值,那么你可以得到一个叫做SURF的关键点,它更快(对大多数任务使用积分图像)

  • 您可以在CPU级别使用并行实现(例如OpenCV使用Intel的TBB),也可以在GPU级别使用(google for sift gpu for related code and doc)。

无论如何,Java中没有这些可用(AFAIK),因此您必须使用Java包装器来打开或自行解决。

答案 2 :(得分:2)

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

我没有特别使用过SIFT,但是在过去的几年里我做了很多物体/运动追踪,所以这更常见。你可能已经尝试了一些观点,我不知道。

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