Android Studio配置及使用OpenCV

1.    软件准备

1.下载并安装Android studio,下载地址见:        

https://developer.android.com/studio/index.html

2.进入官网(http://opencv.org/)下载OpenCV4Android并解压(OpenCV-2.4.10-android-sdk为例)。下面是目录的结构图:

Android Studio配置及使用OpenCV_第1张图片

其中:

sdk 目录即是我们开发opencv所需要的类库;

samples 目录中存放着若干opencv应用示例(包括人脸检测等),可为我们进行android下的opencv开发提供参考;

doc 目录为opencv类库的使用说明及api文档等;

apk 目录则存放着对应于各内核版本的OpenCV应用安装包,其目录结构如图:

Android Studio配置及使用OpenCV_第2张图片

Apk目录中的apk用来管理手机设备中的opencv类库,在运行opencv应用之前,必须确保手机中已经安装了OpenCV_2.4..10_Manager_2.19_*.apk,否则opencv应用将会因为无法加载opencv类库而无法运行。其中各个apk对应的硬件平台如图:

Android Studio配置及使用OpenCV_第3张图片

2.    Android studio 配置openCV

1. 首先按照下图所示的流程创建一个Android studio工程。

Android Studio配置及使用OpenCV_第4张图片

填写工程名

Android Studio配置及使用OpenCV_第5张图片

选择开发设备类型以及Android开发的SDK版本

Android Studio配置及使用OpenCV_第6张图片

根据需要选择Activity模板

Android Studio配置及使用OpenCV_第7张图片

填写主Activity名以及布局文件名

2.将OpenCV引入Android Studio。在Android Studio中选择 File-->Import Module,找到OpenCV解压的路径,选择sdk/java文件夹作为Module进行导入。

Android Studio配置及使用OpenCV_第8张图片

Android Studio配置及使用OpenCV_第9张图片

Android Studio配置及使用OpenCV_第10张图片

3.更新build.gradle信息。导入后会因为Gradle中的配置问题出现错误,在Studio中的左上角选择Project视图,在引入的OpenCVLibrary文件夹下,打开openCVLibrary2410下的build.gradle,修改文件中的compileSdkVersion,buildToolsVersion,minSdkVersion,targetSdkVersion信息,使其与app下的build.gradle中的信息一致。然后点击Gradle进行同步(Sync Gradle)。

Android Studio配置及使用OpenCV_第11张图片

4.添加Module Dependency。选择File --->Project Structure,在app module的Dependencies一栏中,点击右上角的绿色加号,将openCVLibrary添加进去,点击确定。

Android Studio配置及使用OpenCV_第12张图片

Android Studio配置及使用OpenCV_第13张图片Android Studio配置及使用OpenCV_第14张图片

5.复制libs文件夹到项目中。在OpenCV的解压包中,将sdk-->native-->libs文件夹复制,粘贴在Project视图下app-->src-->main目录下,并将其重命名为jniLibs。到此,OpenCV的环境配置完成。

Android Studio配置及使用OpenCV_第15张图片

3.    OpenCV for Application

配置完成之后,先来看一下在应用中如何使用OpenCV。MainActivity类的实现以及activity_main.xml的实现如图:

package com.example.black.opencvtest; 
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory; 
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView; 
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; 
public class MainActivity extends Activity { 
    private Button btn; 
    private ImageView img; 
    private Bitmap srcBitmap; 
    private Bitmap grayBitmap; 
    private boolean flag = true; 
    private boolean isFirst = true; 
    private static final String TAG = "Black Leaf"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 	setContentView(R.layout.activity_opencv); 
        img = (ImageView) findViewById(R.id.img); 
        btn = (Button) findViewById(R.id.btn); 
        btn.setOnClickListener(new ProcessClickListener());
     } 
    @Override 
    protected void onResume() {
        super.onResume(); //load OpenCV engine and init OpenCV library   
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, 	getApplicationContext(), mLoaderCallback); 
        Log.i(TAG, "onResume sucess load OpenCV..."); 
    } 
    //OpenCV库加载并初始化成功后的回调函数  
    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, "成功加载"); break; 
                default: super.onManagerConnected(status); Log.i(TAG, "加载失败"); 	break; 
            } 
        } 
    }; 
    public void procSrc2Gray() { 
        Mat rgbMat = new Mat(); 
        Mat grayMat = new Mat(); 
        srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.genie); 
        grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.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  U
        tils.matToBitmap(grayMat, grayBitmap); //convert mat to bitmap  Log.i(TAG, "procSrc2Gray sucess..."); 
    } 
    public class ProcessClickListener implements View.OnClickListener { 
        @Override 
        public void onClick(View v) { 
            // TODO Auto-generated method stub  
            if (isFirst) { procSrc2Gray(); isFirst = false; } 
            if (flag) { 
                img.setImageBitmap(grayBitmap); 
                btn.setText("查看原图"); 
                flag = false; 
            } 
            else { 
                img.setImageBitmap(srcBitmap); btn.setText("灰度化"); 
                flag = true; 
            } 
        } 
    } 
}

MainActivity类的实现 

 
 
 

activity_main.xml的实现

为了和Android的系统架构保持同步,即吸收Android框架层的优点,OpenCVC引入了OpenCV Manager的概念,其本质就是一个Service,用来管理OpenCV动态链接库(即jniLibs里的文件),如图。 APP在运行时会首先检查OpenCV Manager存在不,如果不存在则会提示安装。如果存在,就会连接这个服务,进一步初始化加载OpenCV库。 所以在运行OpenCV应用之前,需要在目标手机上安装 OpenCV Manager。同时任何opencv项目都在initAsync方法加载OpenCV Library,所有其他的操作必须在这一步成功之后才能执行。

Android Studio配置及使用OpenCV_第16张图片

4.    OpenCV for Uiautomator

接下来再来看一下如何在Uiautomator这个测试框架里面使用OpenCV。同样完成第一、二部分的准备工作之后,需要在工程中引入Uiautomator测试框架。找到app的build.gradle,在里面加入Uiautomator里面的引入配置。

Android Studio配置及使用OpenCV_第17张图片Android Studio配置及使用OpenCV_第18张图片

完成配置之后,与前面类似在目标手机上安装 OpenCV Manager,在测试类中加载OpenCV Library。与前面不同的是,由于Uiautomator不能获得应用的context,故不能使用initAsync方法加载OpenCV Library,这时需要改用OpenCVLoader.initDebug()方法。示例如下:

package com.example.black.opencvexample; 
import android.os.RemoteException;
import android.support.test.uiautomator.UiAutomatorTestCase;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObjectNotFoundException;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import java.io.File; /** * Created by Black on 2016/8/3. */
public class VRdevice extends UiAutomatorTestCase{ 
    private static final String TAG = "Black Leaf"; 
    public synchronized void testCase() throws UiObjectNotFoundException{ 
        String ScreenshotPath = "/mnt/sdcard/screenshot.png"; 
        String SearchImagePath = "/mnt/sdcard/case.png"; OpenCVLoader.initDebug(); 
        getUiDevice().pressHome(); 
        File shotFile = new File(ScreenshotPath); if(shotFile.exists()){ shotFile.delete(); } 
        sleep(2000); 
        UiDevice device = getUiDevice(); 
        device.takeScreenshot(shotFile); 
        TemplateMatching match = new TemplateMatching(); 
        Mat source = Highgui.imread(ScreenshotPath); assertTrue(source.width()>0 && source.height()>0); 
        Mat dst = Highgui.imread(SearchImagePath); 
        assertTrue(dst.width()>0 && dst.height()>0); }

最后需要注意的是,使用OpenCV读取目标手机存储上的图片时,需要配置对存储设备(如SD卡)的读写权限,在AndroidManifest.xml中添加对应权限即可。

Android Studio配置及使用OpenCV_第19张图片


你可能感兴趣的:(Android开发)