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++模块。
上篇博客中Android Studio配置Jni所需要的相关工具
选择OpenCV4Android SDK合适的版本(推荐选择3.1.0版本)
Github上OpenCV人脸识别(Face Detection)开源代码(可选,所下载的SDK中samples->face-detection中有相同的代码)
创建工程中接下来的选项都是默认一直“Next”就好,我们还需要修改一下我们的Activity Name为“FdActivity”,Layout Name为“face_detect_surface_view”,点击“Finish”
新建Android工程之后,我们就要向我们的工程中添加OpenCV模块,具体的操作是:File->New->Import Module...,红色矩形所展示的路径是我们将下载的SDK压缩包解压到指定文件中后,对应的OpenCV java sdk的目录,接着点击“Next",然后在”Finish“
修改OpenCV的gradle
3ff0
与我们app中build.gradle内容相一致
添加依赖关系:File->Project Structure->app->Dependencies->"+"->Module dependency选择OpenCVLibrary310,点击”OK“,如图添加成功。
选择Project视图,右击res
New->Android resource directory,在Resource type中选择raw,点击”Ok“,这部分用来存放脸部训练参数的xml文件
在raw文件中新建并补充lbpcascade_frontalface.xml文件
在FdActivity.java同一目录下,新建DetectionBasedTracker.java,补充FdActivity.java和DetectionBasedTracker.java
这个时候我们可以在Android Studio中看到生成的.h文件
右击main,New->Folder->JNI Folder, "Finish"
将java目录下的.h文件剪切并粘贴到jni目录下,如图:
右击刚刚生成的.h文件,Refactor->Rename,修改为DetectionBasedTracker_jni.h
在Project视图中修改该build.gradle文件
将之前文件的(依据个人gradle版本而定)
接下就是修改我们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”相应的头文件
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添加引用路径
编译通过后,我们就将其run到我们的测试机上
感谢大家阅读,望大家多多帮助!
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模块。感谢大家阅读,望大家多多帮助!
相关文章推荐
- (4.5.5.8)Android Studio 2.2 Espresso Test Recorder-----解放双手,通过录制交互过程实现测试
- Android 如何在 Android Studio 2.2 版本实现 refresh 操作?
- Android Studio 2.2 Espresso Test Recorder-----解放双手,通过录制交互过程实现测试
- [置顶] Android Studio 2.2 实现一个简单的计算器
- apache2.2 + mod_jk + tomcat6 实现apache代理tomcat
- 深入剖析ExtJS 2.2实现及应用连载(12):主内容区域
- APAHCE2.2实现负载均衡实战
- jk方法实现linux下apache2.2和tomcat5.5整合(转)
- 深入剖析ExtJS 2.2实现及应用连载(11): 左边导航菜单
- 关于.Net框架下3D游戏的设计与实现——2.2,使用我们的Axiom
- Android2.2实现后台静默安装apk
- apache2.2+tomcat6+mod_jk模式实现负载均衡
- jk方法实现linux下apache2.2和tomcat5.5整合
- 2.2、线性表的顺序表示和实现
- Ext 2.2-2.3 Ext.ajax.request 同步请求的实现
- Extjs3.3+SWFUpload2.2 实现多文件上传
- 深入剖析ExtJS 2.2实现及应用连载(7):页面布局
- 深入剖析ExtJS 2.2实现及应用连载(10):主页面布局
- 利用OpenCV 2.2 的Python接口实现Ostu(大津法)获取阈值
- openscales 2.2 自定义feature类--带标注的点。以及其他实现方法