原文地址:http://blog.csdn.net/tu_tustudio/article/details/8463119
参考:
http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/O4A_SDK.html
这片文章是介绍如何安装和配置 OpenCV4Android SDK 的,这下总算到正题了。
环境:win7 家庭版(32位)
在文章开始之前,假定你已经看过第一篇文章,已经安装和配置好了以下内容:
Ø JDK
Ø Android SDK and NDK
Ø Eclipse IDE
Ø ADT and CDT plugins for Eclipse
番外篇:
如果你看第一篇的时候,直接安装的Tegra Android Development Pack,那你可以直接去看例子了:
http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/O4A_SDK.html#running-opencv-samples
不送了哈,慢走。
基本信息:
OpenCV4Android SDK package的目录结构如下
OpenCV-2.4.3-android-sdk |_ apk | |_ OpenCV_2.4.3_binary_pack_armv7a.apk | |_ OpenCV_2.4.3_Manager_2.0_XXX.apk | |_ doc |_ samples |_ sdk | |_ etc | |_ java | |_ native | |_ 3rdparty | |_ jni | |_ libs | |_ armeabi | |_ armeabi-v7a | |_ x86 | |_ license.txt |_ README.android |
sdk目录: 包含了OpenCV forandroid开发的API 和库文件
sdk/java: 目录包含了一个android库项目,用以导入eclipse工作空间,以便调用opencv的java api;
sdk/native: 包括opencv c++的头文件(为jni代码提供的), 本地android库文件(*.so和*.a),库文件有ARM-v5,ARM-v7a 和 x86 三种架构;
sdk/etc: 包含Haar和LBP,Haar:Haar-LinkFeatures/哈尔特征;LBP: Local Bin Patterns/基于兴趣点多特征融合;简单的说,这是两类物体识别算法,更详细的求您别问我,我答不上来了;
apk: 使用了opencv库的android程序管理包,这个需要按照你手机的实际芯片情况来选择相应版本手工安装,除非你可以连接上google play自动安装;
samples:没啥,就是存放的例子
doc:OpenCV的各式文档,pdf格式的,当然你也可以看在线的:http://docs.opencv.org.
从OpenCV4Android SDK v2.4.3开始使用 OpenCV ManagerAPI 进行库的初始化。OpenCV Manager是一个android服务,有以下的用处:
a. 压缩apk大小,所有程序使用同样的二进制代码,而不是各自使用各自的本地库;
b. 所有支持平台上自动进行特定的硬件优化;
c. 自动更新和bug修复;
d. opencv库已被信任,所有调用opencv库的包apk可以直接发布到googleplay上;
想看看OpenCV Manager的其他信息,可以看看:
Slides:
https://docs.google.com/a/itseez.com/presentation/d/1EO_1kijgBg_BsjNp2ymk-aarg-0K279_1VZRcPplSuk/present#slide=id.p
参考手册:http://docs.opencv.org/android/refman.html
人工安装 OpenCV4Android SDK
说了半天,终于到正题了:
下载地址,我是找的差不多是最新的版本:
http://sourceforge.net/projects/opencvlibrary/files/opencv-android/2.4.3/
这一页上有三个版本:
2012-12-25的v2.4.3.2;
2012-11-30的v2.4.3.1;
2012-11-02的v2.4.3
想想,保守一点,下载一个v2.4.3吧,为啥?因为我看到官方文档中举例用的这个版本,safety first。
OpenCV-2.4.3-android-sdk.zip下载下来后,解压,示例:
C:\ANDROID\opencv\OpenCV-2.4.3-android-sdk
注意:目录中不要包含空格,否则后续会有麻烦
评:什么空格,我连汉字都避免了,恨不得直接放到根目录下面,免得有问题。唉,真是胆小如鼠呀。
导入opencv库和例子到eclipse
启动eclipse选择workspace位置,如果已经设置过工作空间的,设置一下,重新启动eclipse,重新设置工作空间:
004.jpg
重新打开eclipse,出现了对话框,要求设置workspace目录,我直接设置为了刚才opencv的解压目录,这真是一个彪悍的做法:
005.jpg
将opencv库和例子导入工作空间
OpenCV库打包后做为android库项目,提供给android项目使用,引用一下就行了。
每个例子都是引用了opencv库的普通的android项目,所以要打开例子别忘记了先导入库项目。
步骤:
Eclipse—file—import:
General--Existing Projects intoWorkspace--next按钮
006.jpg
点击了finish以后,加载了所有选择项目到工作空间,开始了疯狂编译,你需要等等。
看了看我的情况,遭遇编译错误:
Console窗口:
007.jpg
Problems窗口:
008.jpg
我的天,我得罪谁了,28个错误,7个告警。
再看看官方文档:
注意:有时会出现编译错误,那你需要:
a. 右键opencv库项目--androidtools--fix project properties;然后project--clean--clean all;
b. 右键有报错的android项目--properties--android,确认编译目标是android3.0及以上;
c. 在problems视图里面检查编译错误,试试自己搞定(这有点推卸责任哈)
完成a后,仍然一堆的错误,少掉了3个,看看gen上面有个红叉,点进去一看:
OpenCVEngineInterface.java 代码里面都是一类错误,类似:
The method getLibraryList(String) of typeOpenCVEngineInterface.Stub.Proxy must override a superclass method
处理方法都是,要不你就在父类里面定义一个同名函数,要不你就去掉@Override,我也懒得细看,通通去掉就是了,点击保存,发现提示:
[2012-12-30 14:44:38 - OpenCV Library - 2.4.3] OpenCVEngineInterface.java was modified manually! Reverting to generated version! |
这意思他看着我人工修改了jva,立刻给恢复回去了。
仔细看看编译错误,大致都是因为库项目没有编译成功,其他的例子都要使用编译结果库文件,所以都跟着瞎起哄,报了一堆的错误出来,只要解决掉库项目的编译就搞定了关键一步,仔细核了一下库项目的报错,一共六个,都是类似的,大概就是下面的样子:
The method asBinder() of type OpenCVEngineInterface.Stub must override a superclass method |
仔细琢磨了一下,估计是jdk的缘故,查了一下compile的jdk是1.5版本的,改成1.6的,果然顺利搞定了。
操作:右键项目—属性—java compiler—配置为1.6
009.jpg
顺带检查一下自己的eclise—windows---preference—java—compiler版本,之前改的是项目的编译器版本。
因为勾选了自动编译的,这一下子错误减少到了3个,看看最后三个长啥样,都类似的:
Android NDK: WARNING: APP_PLATFORM android-9 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml |
把AndroidManifest.xml中的
<uses-sdk android:minSdkVersion="8"/>
改为了
<uses-sdkandroid:minSdkVersion="9" />
重新整理了一遍,所有的项目的compiler统统改为1.6,所有的AndroidManifest.xml的minSdkVersion全部从8改为9。Project—clean—all,重新编译后,只有7个告警了,OK,DONE!
出来混终归是要还的
在第一篇中,想着cmd下敲命令行编译android应用中的c++代码是多么的惬意,不用配置那么大一堆的eclipse环境,现在有闲情雅致,得,补上吧。
仔细看下来,其实很简单,以tutorial-3-native为例,为啥要以它为例?看看代码目录你会发现它有jni目录,下面有两个mk文件和一个cpp文件,还不明白?cpp文件是调用了opencv的库,这个c++代码文件需要c++来编译,所以我得以它为例。
1. New -> Other -> C/C++ ->Convert to a C/C++ Project
2. 选择 tutorial-3-native 转换
“Project type” = Makefile project
“Toolchains” = Other Toolchain
3. Project Properties -> C/C++ Build
${NDKROOT}/ndk-build.cmd
当然要先创建环境变量:NDKROOT
4. Behaviour tab and change “Workbenchbuild type”
点击OK就开始编译这个c++文件了
5. 为了避免c++文件中提示代码错误
Project Properties -> C/C++ General-> Paths and Symbols
添加:
# for NDK r8b and later:
${NDKROOT}/platforms/android-9/arch-arm/usr/include
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/include
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include
${ProjDirPath}/../../sdk/native/jni/include
你看着文字费劲不?要是觉得费劲,刚才我不是导入编译了例子了吗,你右键看看例子tutorial-3-native 的配置就行了,学这个干啥?你如果需要编写c++本地代码来调用opencv库,新建项目可是没现成配置可拣的,这部分东西你就能用上了。
运行例子
以tutorial-2-opencvcamera为例,为啥捏,当然是拣软柿子捏啦,人官方网站上就是用这个例子演示的。
face-detection, Tutorial 3和Tutorial 4三个例子包括了本地代码(c++),所以需要ndk和cdt。
注意:最好用真机。
运行android程序,会吧?不会?自己上网查吧。
我的手机是三星的I699
执行的情况如下:
[2012-12-30 18:58:41 - OpenCV Tutorial 2 - Use OpenCV Camera] ------------------------------ [2012-12-30 18:58:41 - OpenCV Tutorial 2 - Use OpenCV Camera] Android Launch! [2012-12-30 18:58:41 - OpenCV Tutorial 2 - Use OpenCV Camera] adb is running normally. [2012-12-30 18:58:41 - OpenCV Tutorial 2 - Use OpenCV Camera] Performing org.opencv.samples.tutorial2.Sample2NativeCamera activity launch [2012-12-30 18:58:46 - OpenCV Tutorial 2 - Use OpenCV Camera] Uploading OpenCV Tutorial 2 - Use OpenCV Camera.apk onto device 'I69949030899' [2012-12-30 18:58:46 - OpenCV Tutorial 2 - Use OpenCV Camera] Installing OpenCV Tutorial 2 - Use OpenCV Camera.apk... [2012-12-30 18:58:48 - OpenCV Tutorial 2 - Use OpenCV Camera] Success! [2012-12-30 18:58:48 - OpenCV Tutorial 2 - Use OpenCV Camera] Starting activity org.opencv.samples.tutorial2.Sample2NativeCamera on device I69949030899 [2012-12-30 18:58:48 - OpenCV Tutorial 2 - Use OpenCV Camera] ActivityManager: Starting: Intent { act=android.intent.action.MAIN } |
看看手机,这个样子:
010.jpg
如果你安装了google play market,点击yes,自动安装opencv manager和相应的opencv二进制包,如果没有安装的话,就跟我一样,手工安装吧。
注意:
armeabi, armv7a-neon, arm7a-neon-android8,mips 和 x86 平台:
armeabi : ARM v5 和 ARM v6 架构,适用于Android API 8+
armv7a-neon : NEON-optimized ARM v7 架构,适用于Android API 9+,
arm7a-neon-android8 : NEON-optimized ARM v7架构,适用于 Android API 8,
mips : MIPS 架构,适用于 Android API9+,
x86 : Intel x86 CPUs 架构,适用于AndroidAPI 9+.
查看手机的CPU架构类型方法:
C:\Users\xxx>adb shell getprop ro.product.cpu.abi armeabi-v7a |
要是你的adb找不到,就加上adb的全路径吧,在android-sdk\platform-tools下 |
我的系统是android2.3.3,也就是android api 9+(准确的说是api10)了,打开opencv的目录,在apk下找找opencvmanager的相应包:
C:\LHANDROID\opencv\OpenCV-2.4.3-android-sdk\apk 的目录
2012/11/02 21:50 <DIR> . 2012/11/02 21:50 <DIR> .. 2012/11/02 20:07 4,393,235 OpenCV_2.4.3_binary_pack_armv7a.apk 2012/11/02 21:49 4,920,487 OpenCV_2.4.3_Manager_2.0_armeabi-v7a.apk 2012/11/02 19:56 4,694,322 OpenCV_2.4.3_Manager_2.0_armeabi.apk 2012/11/02 19:52 5,714,504 OpenCV_2.4.3_Manager_2.0_mips.apk 2012/11/02 19:46 5,206,052 OpenCV_2.4.3_Manager_2.0_x86.apk 5 个文件 24,928,600 字节 2 个目录 311,142,825,984 可用字节 |
最接近就是OpenCV_2.4.3_Manager_2.0_armeabi-v7a.apk了,不管了,安装吧。
adb install C:\opencv\OpenCV-2.4.3-android-sdk\apk \OpenCV_2.4.3_Manager_armv7a-neon.apk |
安装情况: C:\opencv\OpenCV-2.4.3-android-sdk\apk>adb install C:\LHANDROID\opencv\OpenCV-2.4.3-android-sdk\apk\OpenCV_2.4.3_Manager_2.0_armeabi-v7a.apk 3980 KB/s (4920487 bytes in 1.207s) pkg: /data/local/tmp/OpenCV_2.4.3_Manager_2.0_armeabi-v7a.apk Success |
好了,再来一次,搞定了,结果嘛,就是这个样子的。
011.jpg
就是在拍照的预览上面加了几个字:OpenCV+ Android,然后可以实现灰度和线条的显示效果,灰度的见过啦,不过那种线条的视频效果倒是第一次见。
迫不急待的试了下人面识别,效果不好,识别结果不对,不知道是什么原因,回头再琢磨吧。
好了,告一段落吧,dismissed!88