您的位置:首页 > 移动开发 > Android开发

手把手教你OPENCV FOR ANDROID 之二_ android开发环境搭建

2013-01-25 15:49 686 查看
转自: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

OpenCVEngineInterface.java

/OpenCV Library - 2.4.3/gen/org/opencv/engine line 35 Java Problem

仔细琢磨了一下,估计是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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: