前言
这两天在踩OpenCV的坑,需求:在不安装OpenCV Manager apk的情况下跑通opencv下的人脸检测demo。写下此文记录下;
注:本文采用opencv下的原始人脸检测的demo,所以里面的c代码都是原始包名的,如果你想修改包名则需要自己会jni的知识;后面我自己会修改包名重新生成新的so,如果这部分大家有问题的话,欢迎留言;
一、OpenCV—SDK源码
OpenCV—官网地址
现在最高版本4.0,现在网上部分资料都是采用2.4的sdk,本人亲测3.2的版本要比2.4的版本流畅的不要太多。
下载下来的目录结构
- apk:OpenCV Manager apk的存放目录(根据不同cpu型号有不同的apk请根据自己的机器cpu型号来对应,一般v7a的就好了)。
- samples:opencv代码案例里面包括了人脸检测和其他。
- sdk:包括了sdk和lib包。
二、用AS直接导入人脸检测demo
注:
1:demo是eclipse的,导入的时候可能会有问题,但是应该是很容易解决的;
2:一定要导入import moudule opencv java库。
导入的最后结果如下图所示:
在此过程中可能会出现ndk的配置问题:
- ndk的配置。
1:在gradle.properties中添加
android.useDeprecatedNdk=true
2:在local.properties中添加ndk路径(是你的ndk安装路径)
ndk.dir=D\:\\android\\ndk\\android-ndk32-r10-windows-x86_64\\android-ndk-r10
如果不知道如何配置ndk请自行百度;
3:在app的build.pradle中添加
sourceSets.main {
jni.srcDirs = ['libs']
}
至此所有的准备工作都已OK了,下面开始实干了。
三、实干步骤
- 修改jni下的Android.mk
- 1:注意前面的“#”号,那特么是注释的意思,请干掉。
- 2:注意这里有2个if else的判断(我直接去掉判断了),里面include的是opencvsdk中的OpenCV.mk文件,这个修改成你自己的opencv—sdk路径;如果mk路径错误在jni编译的时候会报错的;仔细看下错误会说明是OpenCV.mk路径找不到。
修改之后成下图:
- 导入opencv下的libs
这个时候我们需要将opencvSDK下的libs导入到我们项目中去,这样我们的项目就不需要安装OpenCV Manager apk了。
这里可以只导入你cpu对应的版本即可能减小项目的大小,但我全部导入了;
- 根据jni生成so
我们看到jni目录下有h和cpp文件,这里面就实现了检测的相关代码,这里我们并不需要动他。
然后我们在jni下ndk_build一下来生成so文件。(如果不知道ndk_build的请看我上篇文章或百度)。
如果这样就生成了so了,我们可以在项目中看到生成了一个obj的目录,
然后我们在将生成的libdetection_based_tracker.so放到jniLibs下的armeabi-v7a目录下。
至此已经完成所有工作。
四、运行项目
上图就是运行后的结果
总结
虽然这个demo简单,但是在没使用过opencv的人可能在配置中会出现各种问题;
- 1:导入opencv——sdk项目需修改版本号,保持跟app版本一致;
- 2:配置ndk(上面有写到出现的问题);
- 3:引用opencv下的libs;在app下直接导入即可,不需要再opencvLibrary下导入。
- 4:生成so;
- 5:将生成的so放入到jniLibs下的armeabi-v7a目录下。
各位对于NDK方面的进阶学习可以参考下图: