文档章节

Android Studio2.2 Preview4实现Face Detection

nextowang
 nextowang
发布于 2016/07/24 22:42
字数 1471
阅读 368
收藏 0
点赞 1
评论 2

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
Android ZXing 二维码、条形码扫描介绍

最近公司的Android项目需要用到摄像头做条码或二维码的扫描,Google一下,发现一个开源的 ZXing项目。它提供二维码和条形码的扫描。扫描条形码就是直接读取条形码的内容,扫描二维码是按照自...

Java编程思想
2013/12/18
0
0
实现在edittext中任意插入图片

MyEditText: public class MyEditText extends EditText { public MyEditText(Context context) { super(context); } public MyEditText(Context context, AttributeSet attrs) { super(cont......

guozhendan
06/26
0
0
A20关机长按关机按钮提示进入安全模式

长按电源键弹出关机按钮,长按关机按钮会弹出进入安全模式的设置,进入安全模式后将停止所有的第三方APP的加载,由于我们的系统只有自己定制的lunch,所以已经去掉系统的加载项LUNCHER2,进入...

wangjian19
2014/04/12
0
0
Camera Framework学习笔记(1)

主要架构 首先,对Camera架构有个大概的认识。 Android的Camera架构基本由Camera APP, Application Framework(Camera.java), Camera JNI, MediaFramework(CameraService) , Camera HAL, ......

adgkns
2014/02/26
0
0
OpenCV 3.4.1 发布,扩展深度神经网络模块

OpenCV 3.4.1 发布,此次更新主要扩展了 DNN(Deep Neural Networks,深度神经网络) 模块,修复了多个 bug 以及做了一些功能改进。 更新内容包括: 增加了对量化TensorFlow网络的支持。 Open...

雨田桑
04/29
0
0
Android WebView -> Display WebArchive

Android's WebView has this saveWebArchive method since API level 11: http://developer.android.com/. It can save entire websites as webarchives, which is great! But how do I get ......

simpower
2014/10/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
今天
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
今天
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
1
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部