如何在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
    
   
 
