Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

Android Opencv 之 Android Studio 进行 opencv 4.2.0 环境搭建,并简单进行图片灰度处理demo

目录


一、简单介绍

在 Android 使用 opencv,进行图片处理。

本节介绍,如何在 Android 搭建 opencv 环境,并简单的demo测试在 Android 上使用 opencv

二、注意实现

1、在使用的时候,把 opencv 模块中的 build.gradle 保持与引用的工程的 build.gradle 一致,不然打包的apk可能无法正常使用哈

三、Opencv for Android 下载

1、百度搜索 opencv,进入 官网

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo
www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

2、进入官网点击 Release,找到 Android

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

3、点击就会跳转,弹出下载界面(不同浏览器界面可能不一样)

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

4、下载好后,进行解压

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

四、Android Studio (我的版本是3.6.2)新建一个工程

1、打开 Android Studio 新建一个工程

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

2、可以新建一个Empty Activity

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

3、去一个工程名

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

五、在Android Studio 工程中引入 Opencv 420

1、在新建的工程中, File - New - Import Module

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

2、找到下载好的 opencv ,解压下的 sdk 文件夹,引入

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo
www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

3、短暂时间后,就会编译成功

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

4、把引入的 Opencv 下的build.gradle 编译版本与 app 的保持一致

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

六、Android Studio 项目中 测试 opencv 功能,验证 opencv 导入成功与否

1、File - Project Structure ...

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

2、在 app 中添加依赖引用 opencv

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

3、新建一个脚本,继承 OpenCVInterface 接口,添加初始化代码

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo
www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

4、导入一张测试图片,然后再布局中添加一个 ImageView

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo
www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

5、编写 MainActivity ,进行初始化,和灰度图片处理

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

6、打包,运行在真机上,效果如下

www.zeeklog.com  - Android Opencv 之 Android Studio 进行 opencv ( 4.2.0) 环境搭建,并简单进行图片灰度处理demo

七、关键代码

1、MainActivity

package com.example.opencvndkandroid0502;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.widget.ImageView;

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 java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private ImageView mImageView;

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            super.onManagerConnected(status);
            if (status == LoaderCallbackInterface.SUCCESS) {
                //服务启动成功,灰度化图片显示到ImageView上
                filterImage();
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mImageView = findViewById(R.id.sample_image);
        new OpenCVNativeLoader().init();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (!OpenCVLoader.initDebug()) {
            //启动OpenCV服务
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, getApplicationContext(), mLoaderCallback);
        } else {
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
    }

    //灰度化图片,暂不做代码说明,复制即可
    private void filterImage() {
        Mat imgMat = null;
        try {
            imgMat = Utils.loadResource(this, R.drawable.demo);
            Imgproc.cvtColor(imgMat, imgMat, Imgproc.COLOR_RGB2BGR);
            Mat resultMat = imgMat.clone();
            Imgproc.cvtColor(imgMat,resultMat,Imgproc.COLOR_BGR2GRAY);
            Bitmap bitmap = Bitmap.createBitmap(resultMat.cols(), resultMat.rows(), Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(resultMat, bitmap);
            mImageView.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2、OpenCVNativeLoader

package com.example.opencvndkandroid0502;

import org.opencv.osgi.OpenCVInterface;

import java.util.logging.Level;
import java.util.logging.Logger;

public class OpenCVNativeLoader implements OpenCVInterface {

    public void init() {
        System.loadLibrary("opencv_java4");
        Logger.getLogger("org.opencv.osgi").log(Level.INFO, "Successfully loaded OpenCV native library.");
    }
}

3、activity_main.xml

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

    <ImageView
        android:id="@+id/sample_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:srcCompat="@drawable/demo" />
</RelativeLayout>