在Androidstudio上配置OpenCV主要包括5个配置过程。这里假设读者已经下载好了OpenCVforAndroid的SDK,如果没有可以去OpenCV的GitHub上下载,我这里使用的是opencv-3.4.0-android-sdk.zip。在解压包中我们可以看到如下的文件(图左)
sdk目录即是我们开发opencv所需要的类库,sdk中包含了etc、java、native,其中java里面包含的是相关的API调用,而native中是一些编译好的文件,这两个都会用到;samples目录中存放着若干opencv应用示例,不过这些例子是eclipse的工程,无法直接在Androidstudio下跑,还得自己重新制作;apk目录则存放着对应于各内核版本的OpenCV_3.4.0_Manager_3.4应用安装包。
首先我们新建一个Android项目,比如CameraTutorial,将项目界面设置为project的样式。如下图所示
在所有准备工作做好了以后,我们就可以导入OpenCV的相关内容了。
1、导入java文件;进入file-new-import module,source directory中填入之前介绍的sdk包中的java文件,如下图所示,填好之后,会自动填入openCVLibrary340,(如下图所示)然后点击next。
接下来会弹出如下界面,直接默认就好,然后点击finish。
2、添加app的依赖;在file-project structure中点击app,点击dependencies,然后点击加号module dependency,添加openCVLibrary340。
调加成功以后会在app下的gradle文件的dependency节点下调加如下一行语句,所以在很多配置教程中在第1步操作后,直接在这里添加这样一行语句,而不进行第2步操作。
3、更改openCVLibrary340下的gradle文件中的相关属性。在这里主要涉及四个属性compileSdkVersion、buildToolsVersion、minSdkVersion、targetSdkVersion,关于这几个属性的介绍可看博客。要将openCVLibrary340下的gradle文件中的这四个属性和app下的gradle文件中的四个属性设置为一致。如下图所示,图左为openCVLibrary340下的gradle文件,图右为app下的gradle文件。更改好了以后,同步一下。
4、在src-main目录下新建一个文件夹jniLibs,将OpenCV中sdk下的native中的libs(在文章开头提到过)中的文件复制到该文件夹下。如下图所示。
可是这些文件很大,我们任取一个出来,基本上都是这个数据结构,不过只有.so文件才是我们真正需要的,这里可以把其他文件全部删除,只留下.so文件即可,这样的话文件就比较小了。
5、在app-build.gradle中的android节点中加入自定义 jni的地址。(我的地址如下:)
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
这样,我们的工作就算完成了。这样我们就算配置好了该有的资源了。不过不需要安装manager还需要在活动中调加如下语句(这里仅介绍opencv3.x版本的,至于opencv2.x版本的配置要稍微麻烦一些,具体可参考相关博客)
6、在activity中的onresume()方法中添加如下语句。(关于这部分的原理可参考博客)
@Override
public void onResume()
{
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.i("cv", "Internal OpenCV library not found. Using OpenCV Manager for initialization");
} else {
Log.i("cv", "OpenCV library found inside package. Using it!");
}
}
至此配置已经完成,可是没有测试那是不过瘾的,我们就在layout中添加一些界面吧,然后再在activity中设置添加一个调节图片灰度的函数。
同时需要在drawable下面放置一张名为girl的图片。
在activity中添加如下代码
private void convert2Gray(){
Mat src = new Mat();
Mat temp = new Mat();
Mat dst = new Mat();
Bitmap image = BitmapFactory.decodeResource(this.getResources(),R.drawable.girl);//从bitmap中加载进来的图像有时候有四个通道,所以有时候需要多加一个转化
Utils.bitmapToMat(image,src);//把image转化为Mat
Imgproc.cvtColor(src,temp,Imgproc.COLOR_BGR2GRAY);//这里由于使用的是Imgproc这个模块所有这里要这么写
Log.i("CV", "image type:" + (temp.type() == CvType.CV_8UC3));
Imgproc.cvtColor(temp,dst,Imgproc.COLOR_GRAY2BGR);
Utils.matToBitmap(dst,image);//把mat转化为bitmap
ImageView imageView = findViewById(R.id.text_view);
imageView.setImageBitmap(image);
//release
src.release();
temp.release();
dst.release();
}
在oncerate()方法中添加
Button gray = findViewById(R.id.button);
gray.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
convert2Gray();
}
});
至此,需要增加的代码就完成了。接下来就可以测试了。在测试之前最好先rebuild下工程。
可以看到app安装成功后会出现如下界面(图左),点击“灰度”这个button后会出现图右的界面。
可以很明显的看到图片变成了一张灰度图像,说明我们的OpenCV环境配置是成功的。
在这个过程中参考了如下博客
https://blog.csdn.net/waww116529/article/details/56833114(主要参考)
https://blog.csdn.net/sinat_30472685/article/details/74560585
https://www.cnblogs.com/gxclmx/p/7698486.html