android jni 人头检测_dlib-android

本文详细介绍了如何在Android Studio项目中集成Dlib库进行人头检测,包括Dlib与OpenCV的关系、集成步骤、编译环境准备、解决编译错误以及在代码中使用Dlib进行人脸检测的示例。需要注意的是,Dlib和OpenCV的STL兼容性问题以及在Release模式下才能提高效率。
摘要由CSDN通过智能技术生成

在Android Studio工程中集成Dlib

在Android Studio工程中集成Dlib的方法流程,由于本人是Android小白,有错误之处还请指正。

集成前需要了解的概念

Dlib是什么?

Dlib是一个使用C++开发的包含机器学习的图形算法工具。Dlib可以跨平台应用于各种操作系统:windows、MacOS、Linux、iOS、Android等几乎所有平台。而且效率非常高,这一点需要注意。Dlib只有在Release下才能最大限度的发挥效率,在Debug下的效率非常低下。以Android为例,Dlib在Debug下的帧率只有不到2FPS,但是在Release下未做任何优化的情况下可以轻松达到15FPS+

Dlib和OpenCV的关系

Dlib是一个算法工具,Dlib自身并不能直接使用,必须先准备好OpenCV,才能使用Dlib,所以在集成Dlib之前,我们必须先集成OpenCV。关于在Android Studio中集成OpenCV的方法请移步:https://github.com/ShawnZhang31/opencv-android-studio 查阅。

在Android工程中Dlib和OpenCV的差异

OpenCV采用C/C++进行开发,为了保证运行效率使用了很多的C代码,但是最新的OpenCV中C++代码的比重越来越大。Dlib完全是实用C++开发,主要是实用C++11。OpenCV团队专门为Android设备编译的Android版本的OpenCV,不过OpenCV团队在编译Android版本的时候使用的STL是gnustl_static。而Dlib的作者并没有为任何平台编译二进制库,而是给出了CMakeLists.txt让用户自己编译,而Dlib的作者也比较推崇大家将Dlib的源码合并到工程中使用。所以我们使用Dlib必须自己编译。不过Dlib因为使用的是更现代化的C++,Dlib在编译的时候默认使用的STL是c++_static或者c++_shared。再加上Dlic使用了C++11,所以使用默认配置编译出来的dlib.so文件在和opencv连接的时候总是报出非常多的错误,甚至经常出现文件找不到的情况。

Android版本的OpenCV的编译相当复杂,有兴趣的可以参看OpenCV官方给出的方法自行编译:https://github.com/opencv/opencv/wiki/Building_OpenCV4Android_from_trunk 。最后的方法是我们采用OpenCV官方编译好的OpenCV库文件,而将Dlib编译的STL修改为gnustl_static,配合OpenCV使用。

注意:2018年10月16日公布的OpenCV 4.0 Beta版本宣称使用了C++编译器。也就意味着与Dlib的默认编译不再存在冲突。因为是Beta版本,我还没有测试,感兴趣的可以自行测试。不过目前OpenCV 4.0 Beta还没有发布Android版本的SDK

集成步骤

集成OpenCV

创建一个支持C++ 11的Android Studio工程集成OpenCV并实现使用OpenCV打开摄像头

具体集成方法请参阅:https://github.com/ShawnZhang31/opencv-android-studio

编译Dlib

编译环境准备(以我个人电脑为例)

操作系统: MacOS 10.14

NDK版本:R16B

Dlib版本:19.15

创建一个dlib4android文件夹并在该文件夹下创建一个jni文件件

文件夹结构如下:

dlib4android.

└── jni

将解压的dlib-19.15文件夹拷贝到jni文件夹下,此时文件结构如下:

dlib4android.

└── jni

└── dlib-19.15

├── CMakeLists.txt

├── dlib

├── documentation.html

├── examples

├── ISSUE_TEMPLATE.md

├── MANIFEST.in

├── python_examples

├── README.md

├── setup.py

└── tools

虽然我们编译的时候只需要dlib-19.15下的dlib文件夹即可,但是为了保险方便期间都可以放进去。

在jni文件夹下创建Android.mk和Application.mk文件,此时文件夹结构如下:

dlib4android.

└── jni

├── Android.mk

├── Application.mk

└── dlib-19.15

├── CMakeLists.txt

├── dlib

├── documentation.html

├── examples

├── ISSUE_TEMPLATE.md

├── MANIFEST.in

├── python_examples

├── README.md

├── setup.py

└── tools

编辑Android.mk文件内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := dlib #定义最终输出的.so文件的名称

LOCAL_SRC_FILES := $(LOCAL_PATH)/dlib-19.15/dlib/all/source.cpp # 编译的源文件

include $(BUILD_SHARED_LIBRARY)

编辑Application.mk文件内容如下:

APP_OPTIM:=release #设置Dlib采用Release模式编译,虽然Dlib默认就是使用Release模式编译的,但是在这里强调一下省心

APP_STL := gnustl_static #为了和OpenCV兼容,STL设置为与OpenCV一直,至于OpenCV 4.0等到发布Android版本的时候再来验证

APP_CPPFLAGS += -std=c++11 #指定采用c++11编译器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值