暑假两个月做了这么多东西几乎一篇博客都没写…现在开始补坑,不然这个项目结束怕是东西都要忘干净了。从这篇开始记录一下,以后想重新上手也简单一些。
现在做的项目需要用到使用摄像头进行颜色识别,也就是牵扯到图像处理的部分,于是便选用了OpenCV这个计算机视觉库,这样用的时候直接调用这个库里给你封装好的函数就可以了。
本系列文章参考了《OpenCV Android 开发实战》(贾志刚著,机械工业出版社),这本书给我学习OpenCV4Android带来了很大帮助,在这里感谢志刚大佬。推荐大家阅读。
新建一个工程、下载OpenCV SDK 之类的就不多说了,这里直接开始说实际配置过程相关的东西。本文所选用的OpenCV版本是3.3。
File——New——Import Module,选择内层的java
文件夹,如上图所示,模块名称会自动显示出当前的OpenCV的版本信息,如下图所示。
点击Next——Finish完成导入。然后再选择File——Project Structure 打开依赖项添加对话框,选择最右边的+按钮,完成添加后如下图所示。
把视图切换到Project,就可以看到多了一个库文件夹OpenCVLibrary330。
选择app下面的libs,然后把OpenCV Android SDK目录native\libs下面文件与文件夹,复制到这个libs里面去。
这里面的是对不同板子芯片abi的适配,大部分的都是armeabi-v7a,牛逼一点的是v8a。根据我这个项目所需要用到的板子,我这里只选择了三个文件夹复制进去。如图所示。
app的build.gradle
(1)在依赖部分添加如下代码
implementation fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
(2)在末尾添加如下配置代码:
task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') {
destinationDir file("$buildDir/native-libs")
baseName 'native-libs'
from fileTree(dir: 'libs', include: '**/*.so')
into 'lib/'
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
项目的bulid.gradle
在repositories中添加如下代码:
maven {
url 'https://maven.google.com/'
name 'Google'
}
}
原书中没有提到这一点,但是我如果不加这一段就无法加载OpenCV本地库,这一点我没有搞懂原因,如果有大佬知晓烦请指导,万分感谢。
修改完毕后,选择build——clean project,之后再选择rebuild project,就完成了OpenCV编译环境的配置。
这时候你可能会出现几十个以下相关报错:
程序包android.hardware.camera2不存在
如果出现了这种错误,选择File——Project Structure 打开依赖项添加对话框,找到openCVLibrary,在Properties选项卡中,将Compile sdk Version修改为API21以上即可。
配置完环境后,如果我们要在代码中用到OpenCV库,以便能够使用其中的图像处理函数,需要进行以下步骤:
1.在MainActivity中,onCreate函数的前面添加:
private String CV_TAG = "OpenCV";
2.定义加载OpenCV本地库的函数:
private void iniLoadOpenCV() {
boolean success = OpenCVLoader.initDebug();
if(success) {
Log.i(CV_TAG, "OpenCV Libraries loaded...");
} else {
Toast.makeText(this.getApplicationContext(),
"WARNING: Could not load OpenCV Libraries!",
Toast.LENGTH_LONG).show();
}
}
3.在onCreate函数中添加加载OpenCV本地库的语句:
iniLoadOpenCV();
当然前面要import进来OpenCV相关的包。这样之后,就可以使用OpenCV库中的函数了。这里我使用了书中一个灰度处理的测试用例:
//设置按下按钮所响应的事件的内容(实际使用OpenCV库的部分)
public void onClick(View v) {
Bitmap bitmap = (BitmapFactory.decodeResource(this.getResources(),R.drawable.wjc));
Mat src = new Mat();
Mat dst = new Mat();
Utils.bitmapToMat(bitmap,src);
Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGRA2GRAY);
Utils.matToBitmap(dst,bitmap);
ImageView iv = (ImageView)this.findViewById(R.id.sample_img);
iv.setImageBitmap(bitmap);
src.release();
dst.release();
实现效果如图: