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

时间:2012-07-15 20:43:14

标签: ios opencv computer-vision object-detection

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

  1. 捕捉框架
  2. 将其转换为灰度
  3. 检测关键点并使用ORB提取描述符
  4. 匹配描述符(2NN)(对象 - >场景)并使用比率测试
  5. 过滤它们
  6. 匹配描述符(2NN)(场景 - >对象)并使用比率测试
  7. 过滤它们
  8. 用4.和5进行非对称匹配去除。
  9. 计算匹配置信度(匹配关键点与总关键点的百分比)
  10. 我的方法可能不是正确的,但即使有很大的改进空间,结果仍然可以。我已经注意到SURF提取太慢了,我无法使用单应性(它可能与ORB有关)。欢迎所有建议!

2 个答案:

答案 0 :(得分:7)

在移动设备上,性能始终是一个问题:)

您可以做一些事情。 OpenCV: C++ and C performance comparison解释了处理时间改进的一般方法。

您项目的一些细节:

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

修改

布拉德拉森的问题很有启发性 - 如果匹配器停留900毫秒进行处理,那么这就是问题所在!查看Andrey Kamaev How Does OpenCV ORB Feature Detector Work?的这篇文章,他解释了描述符和匹配器之间可能的组合。尝试基于FLANN的uchar匹配器。

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

答案 1 :(得分:3)

你应该尝试FAST来检测场景中的对象,比SURF更快,你可以找到使用金字塔版FAST的文章。为了提高手机的性能,你可以优化循环,使用固定算法算术等。祝你好运。