在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编译器