文档章节

Android Studio2.2 Preview4实现Face Detection

nextowang
 nextowang
发布于 2016/07/24 22:42
字数 1471
阅读 388
收藏 0

1. 预处理

你需要做如下的工作 :

  • 上篇博客中Android Studio配置Jni所需要的相关工具
  • 选择OpenCV4Android SDK合适的版本(推荐选择3.1.0版本)
  • Github上OpenCV人脸识别(Face Detection)开源代码(可选,所下载的SDK中samples->face-detection中有相同的代码)

2. 创建Android工程

  1. File->New->New Project,我们将我们的工程文件命名为OpenCVFaceDetection,在Android Studio 2.2中自带创建C++的Android工程,所用的方法是CMake的方法,本文介绍的方法是配置Ndk的方法,所以注意不需要选择红色框中的“Include C++ Support”
  2. 创建工程中接下来的选项都是默认一直“Next”就好,我们还需要修改一下我们的Activity Name为“FdActivity”,Layout Name为“face_detect_surface_view”,点击“Finish”
  3. 新建Android工程之后,我们就要向我们的工程中添加OpenCV模块,具体的操作是:File->New->Import Module...,红色矩形所展示的路径是我们将下载的SDK压缩包解压到指定文件中后,对应的OpenCV java sdk的目录,接着点击“Next",然后在”Finish“

3. 添加OpenCV模块

  1. 导入OpenCV之后会出现如下的错误(这里我们采用Android视图模式),原因是OpenCV模块的gradle和我们Android工程的gradle内容不相匹配
  2. 修改OpenCV的gradle
  3. compileSdkVersion 14
    buildToolsVersion "23.0.2"
    
    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 21

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

    compileSdkVersion 23
    buildToolsVersion "23.0.3"
    
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 23

    修改之后我们看到之前报错的地方就正常import了

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

4. 添加对应Android代码

  1. 根据开源代码分别补充AndroidManifest.xml,face_detect_surface_view.xml的相应代码
  2. 选择Project视图,右击res

    New->Android resource directory,在Resource type中选择raw,点击”Ok“,这部分用来存放脸部训练参数的xml文件
  3. 在raw文件中新建并补充lbpcascade_frontalface.xml文件
  4. 在FdActivity.java同一目录下,新建DetectionBasedTracker.java,补充FdActivity.java和DetectionBasedTracker.java

5. 配置并编写Jni文件

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

    这个时候我们可以在Android Studio中看到生成的.h文件
  2. 右击main,New->Folder->JNI Folder, "Finish"
  3. 将java目录下的.h文件剪切并粘贴到jni目录下,如图:
  4. 右击刚刚生成的.h文件,Refactor->Rename,修改为DetectionBasedTracker_jni.h
  5. 在Project视图中修改该build.gradle文件

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

    修改为

    classpath 'com.android.tools.build:gradle-experimental:0.7.2'
  6. 接下就是修改我们app的build.gradle和OpenCV模块的build.gradle,如图:

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

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

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

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

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

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

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

  1. 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其余的都删除。

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

  3. 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模块。

        感谢大家阅读,望大家多多帮助!

© 著作权归作者所有

共有 人打赏支持
nextowang
粉丝 0
博文 7
码字总数 12120
作品 0
西安
程序员
加载中

评论(2)

nextowang
nextowang

引用来自“Leool”的评论

博主您好,我在按照您的流程配置之后,编译通过,可是在运行的时候闪退,android studio报的错误如下:
E/art: No implementation found for long com.leo.facedetection.DetectionBasedTracker.nativeCreateObject(java.lang.String, int) (tried Java_com_leo_facedetection_DetectionBasedTracker_nativeCreateObject and Java_com_leo_facedetection_DetectionBasedTracker_nativeCreateObject__Ljava_lang_String_2I)
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.leo.facedetection, PID: 30776
java.lang.UnsatisfiedLinkError: No implementation found for long com.leo.facedetection.DetectionBasedTracker.nativeCreateObject(java.lang.String, int) (tried Java_com_leo_facedetection_DetectionBasedTracker_nativeCreateObject and Java_com_leo_facedetection_DetectionBasedTracker_nativeCreateObject__Ljava_lang_String_2I)
at com.leo.facedetection.DetectionBasedTracker.nativeCreateObject(Native Method)
at com.leo.facedetection.DetectionBasedTracker.<init>(DetectionBasedTracker.java:9)
不好意思,好久没查看oschina,您的问题是Jni配置的问题,我当时用的android studio preview版本的,您若是正式版Jni的配置方式和我的方式应该不同,最根本的问题就是so文件没有调用成功
Leool
Leool
博主您好,我在按照您的流程配置之后,编译通过,可是在运行的时候闪退,android studio报的错误如下:
E/art: No implementation found for long com.leo.facedetection.DetectionBasedTracker.nativeCreateObject(java.lang.String, int) (tried Java_com_leo_facedetection_DetectionBasedTracker_nativeCreateObject and Java_com_leo_facedetection_DetectionBasedTracker_nativeCreateObject__Ljava_lang_String_2I)
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.leo.facedetection, PID: 30776
java.lang.UnsatisfiedLinkError: No implementation found for long com.leo.facedetection.DetectionBasedTracker.nativeCreateObject(java.lang.String, int) (tried Java_com_leo_facedetection_DetectionBasedTracker_nativeCreateObject and Java_com_leo_facedetection_DetectionBasedTracker_nativeCreateObject__Ljava_lang_String_2I)
at com.leo.facedetection.DetectionBasedTracker.nativeCreateObject(Native Method)
at com.leo.facedetection.DetectionBasedTracker.<init>(DetectionBasedTracker.java:9)
Android opencv 2.3.1 调试及应用(第一篇)

OpenCV 是开源的人像识别库,在Android上的应用我也刚刚开始摸索。 首先搞定开发环境,看能不能把测试程序给跑起来。 http://sourceforge.net/projects/opencvlibrary/files/opencv-android...

氪金
2013/06/27
0
5
OpenCV4Android&JNI学习中遇到的问题及一些小结

想在Android手机上实现人脸检测,于是搭建一个OpenCV4Android的环境。具体参考如下网址:http://my.eoe.cn/sandking/archive/2999.html ,http://www.360doc.com/content/13/1103/10/144797...

mcyang000
2014/04/09
0
0
Android 计步器应用 - healthgo

healthgo a android pedometer app (安卓计步器) Support Android 4.1- 7.0 Thanks Project/People desc other Realm a mobile database 使用了这个数据库 EventBus a publish/subscribe eve......

五十风
04/13
0
0
解决大图片裁剪问题的详细代码(可直接粘贴复用)

MainActivity中的代码 package com.mzba.photocrop; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import android.app.Activity; import andro......

今日竹石
2014/04/16
0
0
安卓版 Chrome Beta 70 (70.0.3538.17) 引入人脸检测

安卓版 Chrome Beta 70 (70.0.3538.17) 已经发布,可以从 Google Play 上下载使用。 此版本带来了众多新特性,最引人关注的是引入 Shape Detection 和 Web 身份验证。 Shape Detection 初步尝...

h4cd
09/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

play framework 如何支持多数据源

有段时间没有写博客了,但今天又写一篇了,主要是因为这事有一丝自己的思考和动手实践,所以就记录下来了。 现有的问题: play 1.2.4 两台数据库服务器,但是play1.2.4 并不支持同时连接两台...

tuerqidi
26分钟前
1
0
Mysql only_full_group_by解析

查看当前数据库模式: select @@sql_mode; 原因: mysql 5.7中的sql_mode的值中包含'ONLY_FULL_GROUP_BY'; 处理:执行以下SQL set GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,N......

年轻的中年大叔
27分钟前
1
0
防止表单重复提交

1:前端方式(治标不治本) $("#admin-role-save").click(function(){//admin-role-save为submit的idvar ts=$(this);var ts_old_val=ts.val();ts.val("提交中....");ts.att...

uug
27分钟前
1
0
保持屏幕常亮

getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 在act的created方法中调用即可,一般是播放视频的时候......

Carbenson
28分钟前
1
0
智能合约实施指南

与区块链技术一样,智能合约在商业领域也非常有价值。 为了让我们的读者彻底了解智能合约是什么以及它们如何影响现代商业的交易方式,我们准备了本指南。 集中商业模式正在给去中心化的模式让...

geek12345
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部