sam_code@hotmail.com
之前移植过OpenCV2.0到Android平台上(但只支持NativeC调用)。基于OpenCV开发识别程序。
当时不少作算法的同事都对运行效率表示担忧和不解。最为集中的疑问是:
OpenCV计算部分为什么在双核甚至4核 1.2G, 1.6G ARM CPU 会比 4核1.8-2.4G X86
64bit CPU慢如此之多。强烈怀疑是交叉编译OpenCV时出错导致。
Sam当时只能解释虽然从CPU频率来看差距不大,但哪怕的同一架构情况下(如都是X86),也并没有一条确定的公式能够实现主频和实际的运算速度两者之间的数值关系,同主频的AMD和IntelCPU,实际计算能力就差别很大。所以x86
4核 2.4G实际计算能力应该是远超ARM 4核1.2G 的。
但这种说法没有数据验证,无法让只相信数据的工程人员心服(其实连自己也没能完全说服,毕竟精简指令集理论速度也应该快于IA-32吧)。
后来的一些数据,也让我感到很疑惑:在同样的ARM机器上,运行OpenCV2.4.10自带的Android
脸部识别程序(APK),速度竟然能达到10桢以上。这也比我们在NativeC(使用OpenCV2.0交叉编译库)层的速度要快很多。
这段时间再次接触到这一领域,决心把这个问题搞清楚。
0. 准备工作:
0.1: 测试代码的准备:
工欲善其事,比先利其器。Sam首先请同事用C++
和Java分别写了同样流程的程序。利用cv::CascadeClassifier 来做detect
(detectMultiScale).
载入的classifier
xml完全一致,共分析3000张同样的图片(640x480). scale_factor等参数完全相同。
0.2:选定OpenCV2.4.10作为基础对比库:
使用同一版本OpenCV,保证不受OpenCV不同版本效率不同的干扰。
1. 第一步测试数据:
对比项:
A:OpenCV2.4.10 Manager APK + Java例子代码。
B:OpenCV2.4.10 Native C 版本库 + C++例子代码。其中OpenCV2.4.10
Native C库,是Sam通过opencv-2.4.10 Source
Code编译的(http://blog.sina.com.cn/s/blog_602f87700102vdnw.html)
其中platforms/scripts/cmake_android_arm.sh中编译选项为:
cmake -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON
-DBUILD_EXAMPLES=1
-DANDROID_ABI="armeabi-v7a
"
-DCMAKE_TOOLCHAIN_FILE=../android/android.toolchain.cmake
$@ ../..
C++代码采用Release版本(-O2), 并添加了-fomit-frame-pointer
-ffast-math。
A:运行时间为:&#