【一个灰度化的demo 】OpenCV2.4.9 For Android + Android Studio (with gradle)

来源:互联网 发布:淘宝改了名称搜不到 编辑:程序博客网 时间:2024/05/22 17:47

OpenCV的配置一直是个最麻烦的问题,2.4.6以后windows环境下 vs配置我就出错好几十次,来来回回弄了好多遍

之前在实验室弄,为了配合其他人才用的vs2010,现在蹲宿舍干了,改用更简洁的Qt了,qt配置OPENCV方便很多,几句话就搞定了。


人机交互的作业是写一个以图搜图的demo,之前虽然在实验室干过类似的东西,但是现在又得用安卓配置OpenCV了,又是麻烦了我一整天。刚刚终于成了,记录一下,也为他人做个提示。


配置环境的过程参考了http://stackoverflow.com/questions/17767557/how-to-use-opencv-in-android-studio-using-gradle-build-tool

demo的编写参考了 http://blog.csdn.net/yanzi1225627/article/details/16917961

由于其resume后图片会消失,我做了点改动
1.准备工作

首先安装好Android Studio,要自带所有开发套件的,感觉AS比Intellij+ ADT ,eclipse系列都要好,虽然也想过Qt开发安卓,但是太小众了,不好跟人交流。

然后,保证所有环境变量配置正确,比如 JDK ADT JRE等等等等

下载 OpenCV Android SDK,我下的2.4.9,鉴于目前3。0无安卓sdk,2.4.10我也不敢用了,并将下载的OpenCV-2.4.9-android-sdk中的sdk文件夹中的java文件夹 重命名为 opencv

2.创建你的安卓项目(使用gradle,非gradle的教程网上资料很多)在你的工程根目录下new一个文件夹,名字任意比如libraries,将刚才的opencv文件夹整个复制到新建的libraries里面。


3.在android studio中,在opencv的根目录处新建一个 build.gradle文件,复制以下代码

apply plugin: 'android-library'    buildscript {      repositories {          mavenCentral()      }      dependencies {          classpath 'com.android.tools.build:gradle:1.0.0'      }  }    android {      compileSdkVersion 21      buildToolsVersion "21.1.2"        defaultConfig {          minSdkVersion 13          targetSdkVersion 21          versionCode 2490          versionName "2.4.9"      }        sourceSets {          main {              manifest.srcFile 'AndroidManifest.xml'              java.srcDirs = ['src']              resources.srcDirs = ['src']              res.srcDirs = ['res']              aidl.srcDirs = ['src']          }      }  } 


注意其中的versionName 改为你自己下载的OpenCV的版本号,compileSdkVersion和minSdkVersion和targetSdkVersion要和你..\工程名\app\目录下的build.gradle中的设置一样


    dependencies {          classpath 'com.android.tools.build:gradle:1.0.0'
中的gradle版本要和你工程根目录下的build.gradle(不是app下的)中的版本一样,


关于gradle文件的解释如下

http://www.cnblogs.com/youxilua/archive/2013/05/20/3087935.html




4.在工程根目录的 settings.gradle 中添加以下代码,改动之后会提示你需要sync,点sync now

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. include ':libraries:opencv'  
5.在你需要用到opencv的model的/src/main文件夹下新建一个jniLibs文件夹。将刚才下载的OpenCV-2.4.9-android-sdk/sdk/native/libs中的文件拷贝进来。 就是各种.so .a文件,相当于win下的dll文件,程序靠引用这些动态链接库工作。

另外一点就是,libs下的文件夹不一定要全部复制,根据你运行的平台复制对应的文件夹即可,对应关系如图,也跟之后的OpenCV Manager有关 (版本号自行对应)


6.在刚才..工程名\app\ 目录下的build.gradle 中的dependency下添加以下代码

compile project(':libraries:opencv')  

该sync now的都sync 就可以开始编写你的程序了


7.灰度化demo 


首先看下opencv官网的流程图http://docs.opencv.org/platforms/android/service/doc/UseCases.html



从2.4之后,为了和Android的系统架构保持同步,准确说是吸收Android框架层的优点,引入了OpenCV Manager的概念,其本质就是一个Service,用来管理OpenCV动态链接库(即你之前拷贝的那个jniLibs里的东西)。

APP在运行时会首先检查OpenCV Manager存在不,如果不存在则会提示安装。如果存在,就会连接这个服务,进一步初始化加载OpenCV库。  所以第一步就是先在你的目标手机上安装 OpenCV Manager ,apk在 ..\OpenCV-2.4.9-android-sdk\apk 下版本对应之前的图。


具体的代码跟http://blog.csdn.net/yanzi1225627/article/details/16917961 没什么不同,这里只提两点。


public class MyActivity extends Activity implements HelperCallbackInterface{private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {   @Override   public void onManagerConnected(int status) {     switch (status) {       case LoaderCallbackInterface.SUCCESS:       {          Log.i(TAG, "OpenCV loaded successfully");          // Create and set View          mView = new puzzle15View(mAppContext);          setContentView(mView);       } break;       default:       {          super.onManagerConnected(status);       } break;     }   }};/** Call on every application resume **/@Overrideprotected void onResume(){    Log.i(TAG, "Called onResume");    super.onResume();    Log.i(TAG, "Trying to load OpenCV library");    if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mOpenCVCallBack))    {        Log.e(TAG, "Cannot connect to OpenCV Manager");    }}

以上截取官方文档http://docs.opencv.org/platforms/android/service/doc/BaseLoaderCallback.html

任何opencv项目都需要这两个步骤,在initAsync 加载OpenCV Library 所有其他的操作必须在这一步成功之后才能执行。


我最后的程序被ADT自带的虚拟机坑了好久,再次告诫各位不要用AVD,只要不用AVD应该都会成功~



0 0