OpenCV提高了已知对象检测性能

Cla*_*ros 11 opencv object-detection computer-vision ios

我正在开展一个项目,我可以在移动环境中"实时"检测场景中的已知图片(这意味着我正在使用智能手机相机捕捉帧并将帧大小调整为150x225).图片本身可能相当复杂.现在,我正在平均1.2s处理每个帧(使用OpenCV).我正在寻找改善处理时间和全球准确性的方法.我目前的实施工作如下:

  1. 捕捉帧
  2. 将其转换为灰度
  3. 检测关键点并使用ORB提取描述符
  4. 匹配描述符(2NN)(对象 - >场景)并使用比率测试对其进行过滤
  5. 匹配描述符(2NN)(场景 - >对象)并使用比率测试对其进行过滤
  6. 用4.和5非对称匹配去除.
  7. 计算匹配置信度(匹配关键点与总关键点的百分比)

我的方法可能不是正确的方法,但即使有很大的改进空间,结果仍然可以.我已经注意到SURF提取太慢而且我无法使用单应性(它可能与ORB有关).欢迎所有建议!

Sam*_*Sam 7

性能始终是手机上的问题:)

你可以做一些事情.OpenCV:C++和C性能比较解释了处理时间改进的通用方法.

以及您项目的一些细节:

  • 如果您捕获彩色图像并将其转换为灰度图像,则会浪费资源.YUV是原生相机格式.它转换为RGB,这是昂贵的,然后转换为灰色,这也是昂贵的.所有这一切,而YUV(Y)中的第一个通道是灰度......所以,捕获YUV,并通过复制图像数据的第一部分提取第一个通道(Android上的YUV是平面的,这意味着第一个w*h像素属于Y通道)
  • ORB创建得很快.它是.但就在几周前,FREAK被添加到OpenCV中.这是一个新的描述符,其作者声称比ORB/SIFT/SURF /等更准确,更快.试一试.YOu可以在opencv> = 2.4.2中找到它(现在是这个)

编辑

布拉德拉森的问题很有启发性 - 如果匹配器停留900毫秒进行处理,那就是一个问题!查看Andrey Kamaev的这篇文章OpenCV ORB功能检测器如何工作?他解释了描述符和匹配器之间可能的组合.尝试基于FLANN的uchar匹配器.

而且,我想你会得到大量的检测 - 数百或数千 - 如果它需要那么多来匹配它们.尝试限制检测,或仅选择前n个最佳值.

  • OpenFV与FREAK的整合很快,我在一个月前刚刚阅读了他们的会议预发布论文.我也正在尝试GPU加速的BRISK风格的特征提取和匹配,并且一直在考虑修改FREAK以便在GPU上使用.你正好抓住Y平面,这在iOS上使用相机的YUV平面格式非常容易,比如`CVPixelBufferGetBaseAddressOfPlane(cameraFrame,0)`. (2认同)
  • 从YUV中提取Y通道效果很好,处理时间为15ms.然而,在这个特殊情况下,FREAK的结果比ORB慢(0,3s vs 1,5s).我调整了ORB参数,并且能够处理更高分辨率的图像(352x288而不是150x225),并且每帧大约1.5s可以获得更好的结果.这比以前更多的处理时间,但匹配更好,因此需要处理的帧更少,对最终用户来说似乎更快.我无法找到有关基于FLANN的uchar匹配器的任何信息,你有关于它的一些链接吗? (2认同)