11

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

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

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

4

2 回答 2

7

性能在手机上始终是一个问题:)

您可以做几件事。OpenCV:C++ 和 C 性能比较解释了处理时间改进的通用方法。

以及您项目的一些细节:

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

编辑

Brad Larsen 的问题很有启发性——如果匹配器保持 900 毫秒的处理时间,那就是个问题!查看 Andrey Kamaev 的这篇文章OpenCV ORB 特征检测器如何工作?他解释了描述符和匹配器之间可能的组合。试试基于 FLANN 的 uchar 匹配器。

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

于 2012-07-16T07:46:29.573 回答
3

您应该尝试 FAST 来检测场景中的对象,它比 SURF 更快,并且您可以找到使用 FAST 金字塔版本的文章。要提高移动设备的性能,您可以优化循环、使用定点算法等。祝你好运。

于 2012-07-17T11:05:26.170 回答