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