加载中
加载中
表情图片
评为精选
鼓励
加载中...
分享
加载中...
文件下载
加载中...
修改排序
加载中...
所有教程由网友发布,仅供参考,请谨慎采纳。科创不对教程的科学性、准确性、可靠性负责。
OpenCV2.4.9 For Android + Android Studio (with gradle)配置教程
4king2014/12/22软件综合 IP:江苏
好久没来科创了,现在荒凉好多啊- -。 发一篇教程提高下访问~
原文在我博客

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文件,复制以下代码


Other
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

20141218225157805.jpg

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有关 (版本号自行对应)

20131124131308687.png
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

20131124130504437.png
从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 没什么不同,这里只提两点。


Scala
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应该都会成功~

20141218233353918.jpg
附demo代码:
Java
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...");            } }

[修改于 10年6个月前 - 2014/12/22 20:17:17]

来自:计算机科学 / 软件综合严肃内容:教程/课程
10
 
新版本公告
~~空空如也
1211
10年6个月前 IP:四川
736454
请编辑帖子把图片上传一下,感谢哦~~
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
4king作者
10年6个月前 IP:江苏
736456
引用 1211:
请编辑帖子把图片上传一下,感谢哦~~
哦,没注意防盗链- -
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
darkorochi
10年6个月前 IP:湖北
736466
都2.4.9了啊。。。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
4king作者
10年6个月前 IP:江苏
736469
引用 darkorochi:
都2.4.9了啊。。。。。
最新的3.0.0beta
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1176764177
10年6个月前 IP:北京
736493
这就是传说中的安卓开发环境搭建?

我查的方法得在谷歌下一堆东西必须翻墙。
咋办。。
ide用啥好用捏
c艹作为编程语言如何??
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
金星凌日
10年6个月前 IP:陕西
736499
引用 1176764177:
这就是传说中的安卓开发环境搭建?

我查的方法得在谷歌下一堆东西必须翻墙。
咋办。。
ide用啥好用捏
c艹作为编程语言如何??
Android应用一般用Java开发,不过C++也可以用。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
4king作者
10年6个月前 IP:江苏
736514
引用 1176764177:
这就是传说中的安卓开发环境搭建?

我查的方法得在谷歌下一堆东西必须翻墙。
咋办。。
ide用啥好用捏
c艹作为编程语言如何??
IDE可以Android Studio毕竟是谷歌官方的,也可以Intellij + ADT 也可以eclipse + ADT
也可以NDT + 别的东西
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
张静茹
10年6个月前 IP:山东
736536
引用 4king:
IDE可以Android Studio毕竟是谷歌官方的,也可以Intellij + ADT 也可以eclipse + ADT
也可以NDT + 别的东西
visual stodio好像也能开发安卓了,楼主可以试试呀
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
1176764177
10年6个月前 IP:北京
736549
引用 张静茹:
visual stodio好像也能开发安卓了,楼主可以试试呀
好像是英文的不知道安装在中文的vs13下会咋样
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
4king作者
10年6个月前 IP:江苏
736781
引用 张静茹:
visual stodio好像也能开发安卓了,楼主可以试试呀
这不是科创女神吗,我是微软黑, VS不考虑
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
4king
笔友
文章
15
回复
140
学术分
0
2011/02/11注册,7年5个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的