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

OpenCV2.4.9 For Android + Android Studio (with gradle)配置教程

2015-10-30 12:52 609 查看
http://bbs.kechuang.org/read/68719

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

<code>

</code>

注意其中的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 

APP在运行时会首先检查OpenCV
Manager存在不,如果不存在则会提示安装。如果存在,就会连接这个服务,进一步初始化加载OpenCV库。

<code>

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...");

       

    }

}

</code>

布局

<code>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GREY"/>
</LinearLayout>
<!-- 定义显示图片局部细节的ImageView -->
<ImageView android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00f"
android:layout_margin="10dp"/>
<TextView android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>


</code>

lena



运行结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android studio