Android studio4.1.3上使用opencv的方法

  • Post author:
  • Post category:其他




如何在Android Studio4.1.3上使用OpenCV




一、OpenCV概述

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

OpenCV Android SDK是OpenCV针对Android平台提供的开发工具包。Android应用开发一般采用Java或者Kotlin语言进行,二OpenCV主要模块采用C、C++语言编制,因此android环境下可以通过JNI技术、实现JAVA或者Kotlin调用OpenCV算法模块的目的。

在android开发环境中配置好OpenCV以后,我们可以方便的调用各种API函数对计算机图形进行各种处理。OpenCV目前可以实现的功能有:

- 图像处理
- 人机互动
- 图像分割
- 人脸检测
- 动作识别
- 运动追踪
- 运动分析

等等



二、前期准备



1.OpenCV下载链接

https://opencv.org/releases/(本文介绍的opencv版本为3.4.3)

在这里插入图片描述



2.Android Studio下载链接

https://developer.android.google.cn/studio#downloads(本文Android Studio版本为4.1.3)

小伙伴可以根据自己的操作系统进行下载。

在这里插入图片描述



三、使用步骤



1、新建一个项目

在这里插入图片描述

在这里插入图片描述

Language选择Java

勾选”Use legacy android.support libraries” 。若不勾选会加载androidX库,我们不需要androidX库。



2、Android Studio的配置

因为本文种的Android Studio环境在4.0以上。同时要求Android Studio中添加好NDK、CMAKE等组件,下载好OpenCV-Android-SDK(一下为各组件建议版本号)

  • NDK 20.1.5948944
  • CMAKE 3.10.2
  • OpenCV Android SDK 3.4.3

在这里插入图片描述



3、在项目中导入opencv



3.1.1 导入OpenCV库



在这里插入图片描述

点击Next——>Finish。之后在项目的左侧就可以看到OpenCV的库了。如下图所示

在这里插入图片描述



3.1.2Android SDK和Gradle配置

展开项目列表,打开app的build.gradle文件,确定gradle版本号和Android SDK版本号。

在这里插入图片描述

记住app的compileSdkVersion、minSdkVersion、targetSdkVersion版本号的值

切换到OpenCV的build.gradle 更改相应的版本号。再Sync Now

在这里插入图片描述



3.1.3添加module dependency

之前我们已经把OpenCV作为一个module导入了project。接下来为project添加module dependency,使我们的Android项目可以识别OpenCV。点击File—>Project structure…。在弹出的对话框的左边栏选择Dependcies。在中间的Modules中选择app。在右边的declared Dependcies中选择+号,在下来选项中选择第三项Module dependency。

在这里插入图片描述

在弹出的对话框中把OpenCV选中,这个SDK就是我们之前导入的OpenCV SDK。这一步是添加依赖

在这里插入图片描述



3.1.4添加jniLibs

找到刚才建立的项目的路径,我的路径为“F:\opencv\My Application\app\src\main”进入到main文件夹下,然后新建一个文件夹名为“jniLibs”

在这里插入图片描述

进入到opencv-3.4.3-android-sdk\OpenCV-android-sdk\sdk\native\libs文件夹中,将armeabi-v7a这个文件夹复制到刚才的jniLibs文件夹中。

在这里插入图片描述

之后在项目的build.gradle下添加以下代码:

在这里插入图片描述



3.1.5OpenCV库的加载

可编写一个子函数在程序开始的时候加载OpenCV库

   public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iniLoadOpenCV();
    }

    private void iniLoadOpenCV(){
        boolean success= OpenCVLoader.initDebug();
        if (success){
            Toast.makeText(this.getApplicationContext(),"Loading OpenCV success",Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this.getApplicationContext(),"Loading OpenCV fail",Toast.LENGTH_SHORT).show();
        }
    }
}



3.1.6Make Project

以上步骤完成后可以点击build—>Make Project编译程序,正常的话编译可以正常通过。



4、OpenCV简单案例

OpenCV Java API中我们经常会用到这几个类:

  • Mat类主要用来定义Mat对象,切割Mat对象。常规的Bitmap位图在OpenCV中都需要转换为Mat。
  • Core类主要用于Mat的运算,提供了许多运算功能的静态函数。
  • ImgProc类主要用于图形的处理,也提供了许多处理功能的静态函数。
  • Utils类主要用于Mat和/Bitmap之间的转换。



4.1.1 灰度化

在这里插入图片描述

Java代码如下

public class MainActivity extends AppCompatActivity {
    Button button;
    ImageView imageView;
    Mat src,dst;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iniLoadOpenCV();
        button=findViewById(R.id.button);
        imageView=findViewById(R.id.imageView2);

        src=new Mat();
        dst=new Mat();
//        读取存放在drawable下的Bitmap并转换为mat
        try {
            src=Utils.loadResource(this,R.drawable.baidu);
        } catch (IOException e) {
            e.printStackTrace();
        }

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                对mat进行灰度化操作
                Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGRA2GRAY);
//                将灰度化后的mat转化为bitmap
                Bitmap bitmap=Bitmap.createBitmap(dst.width(),dst.height(),Bitmap.Config.ARGB_8888);
                Utils.matToBitmap(dst,bitmap);
//                将bitmap显示在imageview上
                imageView.setImageBitmap(bitmap);
            }
        });
    }

    private void iniLoadOpenCV(){
        boolean success= OpenCVLoader.initDebug();
        if (success){
            Toast.makeText(this.getApplicationContext(),"Loading OpenCV success",Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this.getApplicationContext(),"Loading OpenCV fail",Toast.LENGTH_SHORT).show();
        }
    }
}

xml如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="250dp"
        app:srcCompat="@drawable/baidu" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="灰度化" />


    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="match_parent"
        android:layout_height="250dp" />
</LinearLayout>



4.1.2 二值化

在这里插入图片描述

Java代码如下:

public class MainActivity extends AppCompatActivity {
    Button button1;
    ImageView imageView;
    Mat src,dst;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iniLoadOpenCV();
        button1=findViewById(R.id.button1);
        imageView=findViewById(R.id.imageView2);
        src=new Mat();
        dst=new Mat();
//        读取存放在drawable下的Bitmap并转换为mat
        try {
            src=Utils.loadResource(this,R.drawable.baidu);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                对mat进行灰度化操作
                Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGRA2GRAY);
//                对mat进行二值化操作
                Imgproc.threshold(dst,dst,125,225,Imgproc.THRESH_BINARY);
//                将二值化后的mat转化为bitmap
                Bitmap bitmap=Bitmap.createBitmap(dst.width(),dst.height(),Bitmap.Config.ARGB_8888);
                Utils.matToBitmap(dst,bitmap);
//                将bitmap显示在imageview上
                imageView.setImageBitmap(bitmap);

            }
        });
    }

    private void iniLoadOpenCV(){
        boolean success= OpenCVLoader.initDebug();
        if (success){
            Toast.makeText(this.getApplicationContext(),"Loading OpenCV success",Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this.getApplicationContext(),"Loading OpenCV fail",Toast.LENGTH_SHORT).show();
        }
    }

}

xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">
    
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="250dp"
        app:srcCompat="@drawable/baidu" />
    
    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="match_parent"
        android:layout_height="250dp" />
</LinearLayout>

Demo下载


https://download.csdn.net/download/qq_46140447/18588259



版权声明:本文为qq_46140447原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。