我正在开发一个项目,我可以在移动环境中“实时”检测场景中的已知图片(这意味着我正在使用智能手机相机捕捉帧并将帧大小调整为150x225)。图片本身可能相当复杂。现在,我正在平均1.2s处理每个帧(使用OpenCV)。我正在寻找改善处理时间和全球准确性的方法。我目前的实施工作如下:
- 捕捉帧
- 将其转换为灰度
- 检测关键点并使用ORB提取描述符
- 匹配描述符(2NN)(对象 - >场景)并使用比率测试对其进行过滤
- 匹配描述符(2NN)(场景 - >对象)并使用比率测试对其进行过滤
- 用4.和5非对称匹配去除。
- 计算匹配置信度(匹配关键点与总关键点的百分比)
我的方法可能不是正确的,但即使有很大的改进空间,结果仍然可以。我已经注意到SURF提取太慢了,我无法使用单应性(它可能与ORB有关)。欢迎所有建议!
性能始终是手机上的问题:)
你可以做一些事情。 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个最佳值。
你应该尝试FAST来检测场景中的对象,比SURF更快,你可以找到使用金字塔版FAST的文章。为了提高手机的性能,你可以优化循环,使用固定的算术等等。祝你好运。