您的位置:首页 > 移动开发 > Android开发

Android Studio2.2 Preview4实现Face Detection

2017-02-12 19:00 204 查看
摘要: 无论是Google, Youtube还是百度,当我们用“android studio opencv”类似这样的关键词去搜索如何在Android Studio调用调用opencv时,几乎所有的博客所用的方法都是如“useDeprecatedNdk”,或者还需要配置“Android.mk”这些方法,随着Android Studio不断对C++支持方法的更新,我们也需要新的引用OpenCV的方式,上一篇转发了关于Google官方最新使用Android Studio配置C++的方法,本文将继续添加调用OpenCV中java和C++模块。

1. 预处理

你需要做如下的工作 :

上篇博客中Android Studio配置Jni所需要的相关工具

选择OpenCV4Android SDK合适的版本(推荐选择3.1.0版本)

Github上OpenCV人脸识别(Face Detection)开源代码(可选,所下载的SDK中samples->face-detection中有相同的代码)

2. 创建Android工程

File->New->New Project,我们将我们的工程文件命名为OpenCVFaceDetection,在Android Studio 2.2中自带创建C++的Android工程,所用的方法是CMake的方法,本文介绍的方法是配置Ndk的方法,所以注意不需要选择红色框中的“Include C++ Support”



创建工程中接下来的选项都是默认一直“Next”就好,我们还需要修改一下我们的Activity Name为“FdActivity”,Layout Name为“face_detect_surface_view”,点击“Finish”



新建Android工程之后,我们就要向我们的工程中添加OpenCV模块,具体的操作是:File->New->Import Module...,红色矩形所展示的路径是我们将下载的SDK压缩包解压到指定文件中后,对应的OpenCV java sdk的目录,接着点击“Next",然后在”Finish“



3. 添加OpenCV模块

导入OpenCV之后会出现如下的错误(这里我们采用Android视图模式),原因是OpenCV模块的gradle和我们Android工程的gradle内容不相匹配



修改OpenCV的gradle



compileSdkVersion 14
buildToolsVersion "23.0.2"

defaultConfig {
minSdkVersion 8
targetSdkVersion 21
修改为
3ff0
与我们app中build.gradle内容相一致
compileSdkVersion 23
buildToolsVersion "23.0.3"

defaultConfig {
minSdkVersion 14
targetSdkVersion 23
修改之后我们看到之前报错的地方就正常import了



添加依赖关系:File->Project Structure->app->Dependencies->"+"->Module dependency选择OpenCVLibrary310,点击”OK“,如图添加成功。


4. 添加对应Android代码

根据开源代码分别补充AndroidManifest.xml,face_detect_surface_view.xml的相应代码

选择Project视图,右击res



New->Android resource directory,在Resource type中选择raw,点击”Ok“,这部分用来存放脸部训练参数的xml文件



在raw文件中新建并补充lbpcascade_frontalface.xml文件

在FdActivity.java同一目录下,新建DetectionBasedTracker.java,补充FdActivity.java和DetectionBasedTracker.java



5. 配置并编写Jni文件

创建C头文件(个人习惯用javah的命令行创建方式),过程为:调出操作系统的Terminal,本人用的Window中的cmd,进入我们工程文件中的java目录,在命令行中填写如下命令 : javah + -jni + 工程中有调用Jni函数的class文件



这个时候我们可以在Android Studio中看到生成的.h文件



右击main,New->Folder->JNI Folder, "Finish"



将java目录下的.h文件剪切并粘贴到jni目录下,如图:



右击刚刚生成的.h文件,Refactor->Rename,修改为DetectionBasedTracker_jni.h

在Project视图中修改该build.gradle文件



将之前文件的(依据个人gradle版本而定)
classpath 'com.android.tools.build:gradle:2.2.0-alpha4'
修改为
classpath 'com.android.tools.build:gradle-experimental:0.7.2'


接下就是修改我们app的build.gradle和OpenCV模块的build.gradle,如图:



具体修改的过程详见上一篇”在android studio中创建Hello-JNI工程“的博客

在app的build.gradle配置ndk模块,并将我们的模块命名为”detection_based_tracker“



同步之后我们可以发现DetectionBasedTracker_jni.java中生成双向箭头,表示与我们之前javah编译的.h文件相互对应上了





Project视图的Jni目录下创建DetectionBasedTracker_jni.cpp,并将其补充完整,但是我们会发现又报了很多错误



原因是我们没有引入OpenCV中“native”相应的头文件

6. 添加第三方库和.so动态链接

修改为与我们app中build.gradle内容相一致

Project视图中,右击OpenCVFaceDetection,New->Directory,新建一个名为“distribution”的目录,并在“distribution”中创建“include”和“libs”子目录。我们之前解压过“OpenCV-android-sdk”的目录中,(1)进入sdk\native\jni\include,将“opencv”和“opencv2”复制粘贴到distribution\include中;(3)进入sdk\native\libs,将其中所有的目录复制到distribution\libs中,并且在libs的每个子目录中只保留libopencv_java3.so其余的都删除。



根据Google提供的Experimental Plugin User Guide的文档,我们补充app的build.gradle,首先为distribution添加引用路径

def lib_distribution_root = '../distribution'
创建“detect”的库库中包括头文件和动态链接库的引用
apply plugin: 'com.android.model.application'

def lib_distribution_root = '../distribution'

model {
repositories {
libs(PrebuiltLibraries) {
detect {
// Inform Android Studio where header file dir for this lib
headers.srcDir "${lib_distribution_root}/include"
// Inform Android Studio where lib is -- each ABI should have a lib file
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("${lib_distribution_root}/libs/${targetPlatform.getName()}/libopencv_java3.so")
}
}
}
}
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.3"
defaultConfig {
applicationId = "com.xidian.opencvfacedetection"
minSdkVersion.apiLevel = 14
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
}
ndk {
moduleName = 'detection_based_tracker'
toolchain = 'clang'
stl = 'gnustl_static'
cppFlags.addAll(['-std=c++11','-Wall','-fexceptions', "-frtti"])
ldLibs.addAll(["android", "EGL", "GLESv2", "dl", "log", "z"])
}
buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard-android.txt'))
}
}
productFlavors {
create("arm7") {
ndk.abiFilters.add("armeabi-v7a")
}
}
sources {
main {
jni {
dependencies {
library 'detect' linkage 'shared'
}
}
jniLibs {
source {
srcDir "${lib_distribution_root}/lib"
}
}
}
}

}
}
最后呢,我们build一下



编译通过后,我们就将其run到我们的测试机上



7. 总结与贡献

可以运行,个人觉得OpenCV这个测试的例子仅仅就是一个例子,至于实现人脸识别或者一些其他的功能还需要编者和读者一起分别为自己的目标努力更新java和C代码,github上有一些例子,本文为大家提供一种新版本Android Studio和OpenCV连接和调用的方式,本文的贡献更多在于Deprecate古老的Android.mk和OpenCV.mk的方式,运用gradle简单的连接方式实现Android Studio添加OpenCV的java模块和native模块。

感谢大家阅读,望大家多多帮助!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息