最近在做Android系统的App开发环境搭建。硬件平台采用基于安卓系统的带有相机或者OTG接口的智能设备,利用自带相机传感器或者通过OTG外接USB相机实现影像数据的采集。采集到的影像数据通过OpenCV开源视觉库进行处理,处理结果存储到在安卓平台上广泛使用的SQLite数据库。
Android Studio版本:3.1.2;
OpenCV版本:3.2.0;
Android minimum SDK : Android 4.0;
Android Studio下载地址:http://www.android-studio.org/
安装配置过程:https://blog.csdn.net/m0_37240709/article/details/76069176
OpenCV安卓版本下载:https://www.opencv.org/releases.html 或者 https://sourceforge.net/projects/opencvlibrary/files/opencv-android/。
OpenCV安卓版官网介绍:https://opencv.org/platforms/android/,包括OpenCV的HelloWorld工程怎么创建。
下载的AndroidopecvSDK解压到某一目录,解压出的文件在后续的步骤中会用到。
使用Android Studio建立工程的步骤。这里采用纯JAVA的方式调用OpenCV。
第一次打开Android Studio软件
输入工程名,设置工程路径
选择运行环境,一般选择Android 4.0,可以在大部分设备上运行。
选择界面模板
创建新工程后IDE显示的目录结构。可能跟文件浏览器的目录结构不一样,Android Studio把类似的文件放到一起显示。
把第一步准备工作中解压的文件中的java文件夹复制到新建工程的根目录。假如第一步把sdk解压到D盘根目录,那么java文件夹所在位置是D:\OpenCV-android-sdk\sdk。
拷贝后新建工程的根目录如下:
在Android Studio菜单栏选择File->new->import module,打开导入模块界面,选择刚才复杂的java文件夹,模块名称自动识别成openCVLibrary320。点击Next,采用默认设置,点击完成。
添加完模块后工程目录结构:
在Android Studio菜单栏选择File->project structure,打开如下界面,按顺序操作,在app模块中加入opencv依赖
然后把opencv模块的build.gradle文件中的compileSdkVersion、minSdkVersion、targetSdkVersion与app模块的build.gradle设置为一样的。
在MainActivity.java文件头部的加入
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.calib3d.Calib3d;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
在MainActivity.java类定义内部加入变量mLoaderCallback的定义。
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
Log.i(TAG, "OpenCV loaded successfully");
}
break;
default: {
super.onManagerConnected(status);
}
break;
}
}
};
在MainActivity.java内部加入的重载函数onResume
@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的函数。
比如,在MainActivity.java的按钮回调函数或者触摸回调函数中加入如下读取图片、转为OpenCV的mat格式、二值化操作。
//读取图片
String fileName = Environment.getExternalStorageDirectory().getPath() + "/" + "你在根目录下的图片文件名" + ".jpg";
Bitmap bitmap;
bitmap = BitmapFactory.decodeFile(fileName);
Mat mat_src = new Mat();
Mat mat_dst = new Mat();
//从bitmap转为Mat
Utils.bitmapToMat(bitmap, mat_src);
//二值化
Imgproc.threshold(mat_src,mat_dst,100,255,0);
app运行的结果,从左往右分别是原图,二值化,棋盘格找角点的图片