OpenCV2.4.9 For Android + Android Studio (with gradle)配置教程
10 回复 / 9501 浏览
好久没来科创了,现在荒凉好多啊- -。 发一篇教程提高下访问~
原文在我博客
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.youkuaiyun.com/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文件,复制以下代码
注意其中的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
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.youkuaiyun.com/yanzi1225627/article/details/16917961 没什么不同,这里只提两点。
以上截取官方文档 http://docs.opencv.org/platforms/android/service/doc/BaseLoaderCallback.html
任何opencv项目都需要这两个步骤,在initAsync 加载OpenCV Library 所有其他的操作必须在这一步成功之后才能执行。
我最后的程序被ADT自带的虚拟机坑了好久,再次告诫各位不要用AVD,只要不用AVD应该都会成功~
附demo代码:
原文在我博客
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.youkuaiyun.com/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
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.youkuaiyun.com/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 **/
@Override
protected 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应该都会成功~

附demo代码:
package com.example.ras.myapplication;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
import android.support.v7.app.ActionBarActivity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
Button btnProcess;
Bitmap srcBitmap;
Bitmap grayBitmap;
Bitmap MaskBitmap;
ImageView imgLena;
TextView OpCVversion;
private static final String TAG = "MainActivity";
private static boolean flag = true;
private static boolean isFirst = true; // Grey
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
// TODO Auto-generated method stub
switch (status) {
case BaseLoaderCallback.SUCCESS:
Log.i(TAG, "Load success");
break;
default:
super.onManagerConnected(status);
Log.i(TAG, "Load fail");
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
btnProcess.setOnClickListener(new ProcessClickListener());
}
public void initUI(){
btnProcess = (Button)findViewById(R.id.button);
imgLena = (ImageView)findViewById(R.id.imageView);
OpCVversion = (TextView)findViewById(R.id.textView3);
OpCVversion.setText("Ver: " + OpenCVLoader.OPENCV_VERSION_2_4_9);
Log.i(TAG, "initUI sucess...");
}
public void procSrc2Gray(){
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.lena);
grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Config.RGB_565);
Utils.bitmapToMat(srcBitmap, rgbMat);//convert original bitmap to Mat, R G B.
Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//rgbMat to gray grayMat
Utils.matToBitmap(grayMat, grayBitmap); //convert mat to bitmap
Log.i(TAG, "procSrc2Gray sucess...");
}
private class ProcessClickListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(isFirst)
{
procSrc2Gray();
isFirst = false;
}
if(flag){
imgLena.setImageBitmap(grayBitmap);
btnProcess.setText("Origin");
flag = false;
}
else{
imgLena.setImageBitmap(srcBitmap);
btnProcess.setText("Grey");
flag = true;
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//load OpenCV engine and init OpenCV library
isFirst = true;
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this, mLoaderCallback);
Log.i(TAG, "onResume sucess load OpenCV...");
}
}
[修改于 2 年前 - 2014-12-22 20:17:17]
都2.4.9了啊。。。。。
这就是传说中的安卓开发环境搭建?
我查的方法得在谷歌下一堆东西必须翻墙。
咋办。。
ide用啥好用捏
c艹作为编程语言如何??
我查的方法得在谷歌下一堆东西必须翻墙。
咋办。。
ide用啥好用捏
c艹作为编程语言如何??
引用 张静茹:好像是英文的不知道安装在中文的vs13下会咋样
visual stodio好像也能开发安卓了,楼主可以试试呀
引用 张静茹:这不是科创女神吗,我是微软黑, VS不考虑
visual stodio好像也能开发安卓了,楼主可以试试呀