Android Studio 2.2 + OpenCV3.4.1_4_Android_Sdk环境配置

准备文件

首先需要准备一下文件:

1、 opencv-3.4.1-android-sdk.zip,可以去OpenCV官网下载,如下,选择Android Pack


2、 已经在win7系统上安装好Android Studio2.2Java JDK1.8 JRE 1.8

进行安装

第一步:解压opencv-3.4.1-android-sdk.zip

将下载opencv-3.4.1-android-sdk.zip解压目录G:\OpenCV-android-sdk下目录结构如下图

sdk: 即是我们开发opencv所需要的类库,包括JavaC++,如下图


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


注意要在手机上安装这些apk应用文件,首先要安装OpenCV3.4.1 Manager package,在apk目录下。(华为mate964的,所以选择安装OpenCV_3.4.1_Manager_3.41_arm64-v8a.apk

apk: 存放着对应于各内核版本的OpenCV应用安装包,如下图


第二步,配置Android Studio

2.1打开Android Studio,新建一个工程,命名为OpencvTest,一直点击Next,最后一步点击finish,如下图







完成之后会出现一些错误,此时,将app目录build.gradle文件的内容,如图2.1处的两个地方修改成24compile 'com.android.support:appcompat-v7:24.2.1',点击右上角Sync Now即可消除错误。


2.1 app目录build.gradle文件的内容

2.2File->New->Import Moudle,然后Source directory:选择G:\OpenCV-android-sdk\sdk\java,选择OK,选择Finish,如下图所示



完成后,编译器会重新编译gradle,然后会出现一些错误,此时打开OpenCVLibrary341目录下的build.gradle,将里面

1)compileSdkVersion

2)buildToolsVersion

3)minSdkVersion

4)targetSdkVersion

将上面四个内容与app文件夹下的build.gradle中信息相一致,然后点击右上角Try again,此时错误小时。如下图



2.3打开File->Project Structure,选择左侧的app,然后选择里面的Dependencies,点击+号,选择第三个Moudle dependency,选择




2.4右键点击Android StudioApp目录,选择New->Folder->JNI Folder,进入New Android Component窗口点击change Folder location,在New Folder location填写src/main/jniLibs然后点击Finish这样我们就创建了一个JNILibs的目录



2.5 进入电脑的G:\OpenCV-android-sdk\sdk\native\libs目录下,复制全部文件夹(这些CPU架构的文件夹),拷贝到Android Studio中我们刚刚建立的文件夹中。如下图所示:




完了之后,我们会看到jniLibs目录下会有刚刚我们复制的文件夹。这样,我们就把这些CPU架构文件导入到jniLibs文件夹内了。


至此,我们已经完全配置好Android Studio for OpenCV的开发环境了。

第三步,测试OpenCV

3.1我们在MainActivity.java中的public class MainActivity extends AppCompatActivity函数中添加以下代码:

 
 
    static{        if(!OpenCVLoader.initDebug()){            //handle initialization error        }        else{            System.loadLibrary("my_jni_lib1");            System.loadLibrary("my_jni_lib2");        }   }

这段代码表示,如果OpenCV加载成功,则在logcat日志中显示OpenCV successfully loaded.否则,显示OpenCV not loaded.

3.2Android Studio下方选中Android Monitor,然后在Android Monitor窗口中右上角选择Edit Filter Configuration,出现Create New logcat Filter,内容填写如下图所示:


3.3最后,先运行一个Android模拟器,然后点击Run app按钮,即可显示出下图内容

四步,图片灰度化测试程序

4.1下载一张图片(不要太大,300x300即可复制粘贴到res/drawable目录下,如图:

4.2修改MainActivity.java中的代码:

package com.example.cvlab.opencvtest;


import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;


import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;


public class MainActivity extends Activity {
//    static{
//        if(!OpenCVLoader.initDebug()){
//            //handle initialization error
//        }
//        else{
//            System.loadLibrary("my_jni_lib1");
//            System.loadLibrary("my_jni_lib2");
//        }
//    }


    private Button btn;
    private ImageView img;


    private Bitmap srcBitmap;
    private Bitmap grayBitmap;
    private static boolean flag = true;
    private static boolean isFirst = true;
    private static final String TAG = "gao_chun";




    @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
    public void onResume()
    {
        super.onResume();
        if (!OpenCVLoader.initDebug()) {
            Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
        } else {
            Log.d(TAG, "OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
    }




    //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.img1);
        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
        Utils.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;
            }
        }
    }


}

4.3创建一个activity_opencv.xml,内容为:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="OpenCV"/>


    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:background="@drawable/img1"/>


    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="灰度化"
        android:layout_below="@+id/img"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="11dp" />
    "


</RelativeLayout>

4.4打开一个安卓模拟器,点击Run app按钮如果出现问题:没有找到OpenCV Manager需要安装OpenCV Manager。

解决办法: 采用静态初始化的方法,MainActivity.java中onResume()函数替换

代码

protected void onResume() {
    super.onResume();
    //load OpenCV engine and init OpenCV library
    
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, getApplicationContext(), mLoaderCallback);
    Log.i(TAG, "onResume sucess load OpenCV...");
}

替换为:

public void onResume()
{
    super.onResume();
    if (!OpenCVLoader.initDebug()) {
        Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
    } else {
        Log.d(TAG, "OpenCV library found inside package. Using it!");
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

重新Run app,即可解决问题。演示效果如图:

   




  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值