dlib移植到android_dlib android 移植 - CSDN
  • 移植dlib到android

    2016-01-30 11:42:19
    1、文件目录 /src/face_landmark_detection_test1_ex.cpp ...———-Android.mk2、文件内容 2.1 Application.mk[zzz@localhost jni]$ cat Application.mk APP_STL:=gnustl_static APP_CPPFLAGS:=-fr

    1、文件目录
    /src/face_landmark_detection_test1_ex.cpp
    —-/jni/
    ———-Application.mk
    ———-Android.mk

    2、文件内容
    2.1 Application.mk

    [zzz@localhost jni]$ cat Application.mk 
    APP_STL:=gnustl_static
    APP_CPPFLAGS:=-frtti -fexceptions
    APP_ABI:=armeabi-v7a
    APP_PLATFORM:=android-8
    APP_BUILD_SCRIPT:=Android.mk
    APP_CFLAGS+=-DDLIB_NO_GUI_SUPPORT=1
    [zzz@localhost jni]$ 
    

    上面的APP_CFLAGS+=-DDLIB_NO_GUI_SUPPORT=1是因为不需要使用gui相关的功能。

    编译dlib的时候,还改了两个文件引用头文件的地方:

    <png.h>改为"../external/libpng/png.h"
    <jpeglib.h>改为"../external/libjpeg/jpeglib.h"

    2.2 Android.mk

    [zzz@localhost jni]$ cat Android.mk
    
    
    #include $(CLEAR_VARS)
    
    LOCAL_PATH:=$(call my-dir)
    LOCAL_MODULE:=face_landmark_detection_test1_ex
    LOCAL_PATH:=$(call my-dir)
    LOCAL_MODULE_FILENAME:=face_landmark_detection_test1_ex
    LOCAL_SRC_FILES:=../../face_landmark_detection_test1_ex.cpp  /home/zzz/software/dlib-18.18/dlib/all/source.cpp
    LOCAL_C_INCLUDES:=/home/zzz/software/dlib-18.18/
    #LOCAL_EXPORT_C_INCLUDES:=/home/zzz/software/dlib-18.18/
    include $(BUILD_EXECUTABLE)

    在LOCAL_SRC_FILES中,直接把dlib的源文件作为源文件之一,向之前在dlib移植到arm上说的一样,简单的不能再简单。
    注意头文件路径。

    这里有个问题:如果我在上面打开了:
    include $(CLEAR_VARS)
    会报以下的错误:

    [zzz@localhost jni]$ ndk-build NDK_APPLICATION_MK=Application.mk
    make: *** No rule to make target `/home/zzz/software/android-ndk-r9d/build/core/../../face_landmark_detection_test1_ex.cpp', needed by `/home/zzz/software/dlib-18.18/examples/build_android/obj/local/armeabi-v7a/objs/face_landmark_detection_test1_ex/__/__/face_landmark_detection_test1_ex.o'.  Stop.
    [zzz@localhost jni]$ 
    

    2.3 执行

    zzz@localhost jni]$ ndk-build NDK_APPLICATION_MK=Application.mk
    [armeabi-v7a] Compile++ thumb: face_landmark_detection_test1_ex <= face_landmark_detection_test1_ex.cpp
    [armeabi-v7a] Compile++ thumb: face_landmark_detection_test1_ex <= source.cpp
    [armeabi-v7a] Executable     : face_landmark_detection_test1_ex
    [armeabi-v7a] Install        : face_landmark_detection_test1_ex => libs/armeabi-v7a/face_landmark_detection_test1_ex
    [zzz@localhost jni]$ ndk-build
    

    因为我这个是有jin目录的,所以,不需要再额外指定NDK_APPLICATION_MK也可以。

    问题记录:
    1、
    jni/: error: iostream: No such file or directory
    或者其他头文件找不到。
    解决办法:
    在Application.mk中加入:
    APP_STL:=gnustl_static 或 gnustl_shared , c++_static , c++_shared
    但是用system,stlport_static stlport_shared会有头文件找不到。
    参考:
    http://stackoverflow.com/questions/9130429/android-ndk-build-iostream-no-such-file-or-directory

    APP_STL的取值可以为:
    system stlport_static stlport_shared gnustl_static gnustl_shared gabi++_static gabi++_shared c++_static c++_shared none

    2、
    /build-binary.mk:393: * target pattern contains no `%’

    3、
    如果我把Android.mk修改为如下(先编译出dlib的静态库,再与测试程序链接),就会报如下错误:

    [zzz@localhost jni]$ ndk-build
    [armeabi-v7a] Compile++ thumb: dlib <= source.cpp
    [armeabi-v7a] StaticLibrary  : dlib.a
    make: *** No rule to make target `/home/zzz/software/android-ndk-r9d/build/core/../../face_landmark_detection_test1_ex.cpp', needed by `/home/zzz/software/dlib-18.18/examples/build_android/obj/local/armeabi-v7a/objs/face_landmark_detection_test1_ex/__/__/face_landmark_detection_test1_ex.o'.  Stop.

    Android.mk的内容为:

    [zzz@localhost jni]$ cat Android.mk
    
    
    LOCAL_PATH:=$(call my-dir)
    LOCAL_MODULE:=dlib
    LOCAL_MODULE_FILENAME:=dlib
    LOCAL_SRC_FILES:=/home/zzz/software/dlib-18.18/dlib/all/source.cpp
    LOCAL_C_INCLUDES:=/home/zzz/software/dlib-18.18/
    
    
    #LOCAL_EXPORT_C_INCLUDES:=/home/zzz/software/dlib-18.18/
    #include $(BUILD_EXECUTABLE)
    include $(BUILD_STATIC_LIBRARY)
    
    ####################################################
    #include $(CLEAR_VARS)
    LOCAL_PATH:=$(call my-dir)
    LOCAL_MODULE:=face_landmark_detection_test1_ex
    LOCAL_MODULE_FILENAME:=face_landmark_detection_test1_ex
    LOCAL_SRC_FILES:=../../face_landmark_detection_test1_ex.cpp # /home/zzz/software/dlib-18.18/dlib/all/source.cpp
    LOCAL_C_INCLUDES:=/home/zzz/software/dlib-18.18/
    
    
    LOCAL_SHARED_LIBRARIES:=dlib
    
    #LOCAL_EXPORT_C_INCLUDES:=/home/gumh/software/dlib-18.18/
    #include $(BUILD_EXECUTABLE)
    include $(BUILD_STATIC_LIBRARY)

    原因还不明白。。。

    补充(2016-1-30):
    由于上面编译的时候,没有将jpeg,png的库编译进去,因此,在真正运行程序的时候,会报错。重新将相关的代码组织进mk文件进行编译,文件结构没变,各文件的情况如下:

    1、Application.mk

    APP_STL:=gnustl_static  ##ok
    #APP_STL:=stlport_static ##not work!
    #APP_STL:=system  ##not work!
    #APP_STL:=c++_static  ##ok
    #APP_STL:=c++_shared  ##ok
    #APP_STL:=gnustl_shared ##ok
    APP_CPPFLAGS:=-frtti -fexceptions
    APP_ABI:=armeabi-v7a
    APP_PLATFORM:=android-8
    APP_BUILD_SCRIPT:=Android.mk
    APP_CFLAGS+=-DDLIB_NO_GUI_SUPPORT=on
    #APP_CFLAGS+=-DDLIB_PNG_SUPPORT=off
    APP_CFLAGS+=-DDLIB_JPEG_SUPPORT=on
    APP_CFLAGS+=-DDLIB_JPEG_STATIC=on

    2、Android.mk

    
    all_cpp_files_recursively = \
     $(eval src_files = $(wildcard $1/*.cpp)) \
     $(eval src_files = $(src_files:$(LOCAL_PATH)/%=%))$(src_files) \
     $(eval item_all = $(wildcard $1/*)) \
     $(foreach item, $(item_all) $(),\
      $(eval item := $(item:%.cpp=%)) \
      $(call all_cpp_files_recursively, $(item))\
     )
    
    
    #3 自定义了一个all_c_files_recursively 函数,递归遍历返回给定目录下所有C源文件。
    all_c_files_recursively = \
     $(eval src_files = $(wildcard $1/*.c)) \
     $(eval src_files = $(src_files:$(LOCAL_PATH)/%=%))$(src_files) \
     $(eval item_all = $(wildcard $1/*)) \
     $(foreach item, $(item_all) $(),\
      $(eval item := $(item:%.c=%)) \
      $(call all_c_files_recursively, $(item))\
     )
    
    
    LOCAL_PATH:=$(call my-dir)
    include $(CLEAR_VARS)
    #####################程序################
    LOCAL_SRC_FILES := $(call all_cpp_files_recursively,$(LOCAL_PATH)/../../../dlib/external/libjpeg/) #将jpeg相关代码加入
    LOCAL_SRC_FILES += $(LOCAL_PATH)/../../../dlib/all/source.cpp
    LOCAL_C_INCLUDES:=/home/gumh/software/dlib-18.18/ $(LOCAL_PATH)/../../../dlib/entropy_decoder/
    LOCAL_CPP_INCLUDES:=${LOCAL_C_INCLUDES}
    LOCAL_CXX_INCLUDES:=${LOCAL_C_INCLUDES}
    
    $(warning "-------------the value of LOCAL_SRC_FILES is $(LOCAL_SRC_FILES)--------------------")
    
    ##neon start
    TARGET_ARCH_ABI :=armeabi-v7a
    LOCAL_ARM_MODE := arm 
    LOCAL_ARM_NEON := true
    
    ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
        LOCAL_CFLAGS := -DHAVE_NEON=1
        LOCAL_CXXFLAGS := -DHAVE_NEON=1
    endif
    LOCAL_CFLAGS += -mfloat-abi=softfp -mfpu=vfpv4
    ###neon end
    
    
    ##放在一起编译
    LOCAL_MODULE:=face_landmark_detection_test1_ex
    LOCAL_MODULE_FILENAME:=face_landmark_detection_test1_ex
    LOCAL_SRC_FILES+=../../face_landmark_detection_test1_ex.cpp 
    
    include $(BUILD_EXECUTABLE)
    

    从上面的文件可以看到,其实就是配合source.cpp定义的宏,把相关的jpeg的源代码加入一起编译。

    是否可以先编译出dlib的静态库,给后面的应用程序编译使用呢?
    新加一个Android-prebuild.mk:

    
    
    all_cpp_files_recursively = \
     $(eval src_files = $(wildcard $1/*.cpp)) \
     $(eval src_files = $(src_files:$(LOCAL_PATH)/%=%))$(src_files) \
     $(eval item_all = $(wildcard $1/*)) \
     $(foreach item, $(item_all) $(),\
      $(eval item := $(item:%.cpp=%)) \
      $(call all_cpp_files_recursively, $(item))\
     )
    
    
    #3 自定义了一个all_c_files_recursively 函数,递归遍历返回给定目录下所有C源文件。
    all_c_files_recursively = \
     $(eval src_files = $(wildcard $1/*.c)) \
     $(eval src_files = $(src_files:$(LOCAL_PATH)/%=%))$(src_files) \
     $(eval item_all = $(wildcard $1/*)) \
     $(foreach item, $(item_all) $(),\
      $(eval item := $(item:%.c=%)) \
      $(call all_c_files_recursively, $(item))\
     )
    
    
    
    
    LOCAL_PATH:=$(call my-dir)
    
    ############1##################
    #####################libdlib.a################
        $(warning "--------build dlib ---------")
        include $(CLEAR_VARS)
        LOCAL_MODULE:=dlib
        LOCAL_SRC_FILES := $(call all_cpp_files_recursively,$(LOCAL_PATH)/../../../dlib/external/libjpeg/)
        LOCAL_SRC_FILES += $(LOCAL_PATH)/../../../dlib/all/source.cpp
        LOCAL_C_INCLUDES:=/home/gumh/software/dlib-18.18/ $(LOCAL_PATH)/../../../dlib/entropy_decoder/
        LOCAL_CPP_INCLUDES:=${LOCAL_C_INCLUDES}
        LOCAL_CXX_INCLUDES:=${LOCAL_C_INCLUDES}
    
        $(warning "-------------the value of LOCAL_SRC_FILES is $(LOCAL_SRC_FILES)--------------------")
    
        ##neon start
        TARGET_ARCH_ABI :=armeabi-v7a
        LOCAL_ARM_MODE := arm 
        LOCAL_ARM_NEON := true
    
        ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
            LOCAL_CFLAGS := -DHAVE_NEON=1
            LOCAL_CXXFLAGS := -DHAVE_NEON=1
        endif
    
        LOCAL_CFLAGS += -mfloat-abi=softfp -mfpu=vfpv4
    
        ########海思的设置:set(CMAKE_CXX_FLAGS           "-mthumb -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations"     CACHE STRING "c++ flags")
    
        ###neon end
    
        include $(BUILD_STATIC_LIBRARY)
    
    ########2##################
    ##########build app##############
    $(warning "--------build app---------")
    
    #use prebuild dlib
    LOCAL_MODULE:=mydlib
    LOCAL_SRC_FILES:=libdlib.a
    LOCAL_EXPORT_C_INCLUDES:=/home/gumh/software/dlib-18.18/ $(LOCAL_PATH)/../../../dlib/entropy_decoder/
    include $(PREBUILT_STATIC_LIBRARY)
    
    ###app#######
    include $(CLEAR_VARS)
    LOCAL_MODULE:=face_landmark_detection_test1_ex
    LOCAL_SRC_FILES:=../../face_landmark_detection_test1_ex.cpp 
    LOCAL_STATIC_LIBRARIES:=mydlib
    include $(BUILD_EXECUTABLE)
    
    ##############
    

    在把Application.mk里的APP_BUILD_SCRIPT改为:Android-prebuilt.mk
    APP_BUILD_SCRIPT:=Android-prebuilt.mk

    一个简单的make.sh

    [zzz@localhost jni]$ cat make.sh 
    #!/bin/sh
    
    ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk 
    

    (如何传递参数,在Android.mk里可以根据参数来编译不同的部分?如
    ifeq ($(my_target),”dlib”)就编译dlib库,否则编译其他程序。

    执行:
    1、先构建libdlib.a
    2、将编译出来的libdlib.a拷贝到Android.mk的同目录下,
    2、再构建app

    展开全文
  • android dlib移植

    2018-11-12 10:59:38
    cmake 配置  cmake_minimum_required(VERSION 3.4.1) ...include(src/main/cpp/dlib/cmake) set(CMAKE_VERBOSE_MAKEFILE on) add_library( # Sets the name of the library.  native-lib  #...

    cmake  配置 

    cmake_minimum_required(VERSION 3.4.1)

    include(src/main/cpp/dlib/cmake)

    set(CMAKE_VERBOSE_MAKEFILE on)

    add_library( # Sets the name of the library.
                 native-lib
                 # Sets the library as a shared library.
                 SHARED

                 # Provides a relative path to your source file(s).
                 src/main/cpp/dlib/all/source.cpp
                 src/main/cpp/native-lib.cpp )

    find_library( # Sets the name of the path variable.
                  log-lib

                  # Specifies the name of the NDK library that
                  # you want CMake to locate.
                  log )

    target_link_libraries( # Specifies the target library.
                           native-lib
                            dlib
                           # Links the target library to the log library
                           # included in the NDK.
                           ${log-lib} )

    gradle配置  

    cppFlags "-frtti -fexceptions -std=c++11"
    arguments "-DANDROID_STL =c++_shared"

     

    另外  会报错  <png.h> 和 <jpeglib.h>  

    <png.h>改为"../external/libpng/png.h"

    <jpeglib.h>改为"../external/libjpeg/jpeglib.h"

    展开全文
  • 把一份优秀的代码移植到移动设备平台的工作显得很有意义,所幸这项工作已经有人做了,在github上有一个dlib-android的项目。其实移植dlib库的工作,本身也不是什么难事。但这个dlib-android附带的文档给出的编译方式...

    dlib是基于C++实现了机器学习学习算法的工具包,广泛应用于AI领域。有时候会结合OpenCV用于视觉处理。把一份优秀的代码移植到移动设备平台的工作显得很有意义,所幸这项工作已经有人做了,在github上有一个dlib-android的项目。其实移植dlib库的工作,本身也不是什么难事。但这个dlib-android附带的文档给出的编译方式是linux环境,这对于在Windows下办公的开发者来说,很不方便,搭个环境就要耗掉蛮多时间。实际上在Windows环境下也可以编译成功,但需要改几个地方。以下我记录以下编译的整个过程:

    第一步:
    git clone --recursive https://github.com/tzutalin/dlib-android.git
    假设你的路径为:\dlib-android\

    第二步:
    准备ndk编译环境,并且将ndk-build加入path环境变量中。准备好OpenCV-android-sdk,我用的是版本3.3版本,其他版本应该也行。将解压后的\OpenCV-android-sdk\sdk\native目录下的文件拷贝到\dlib-android\third_party\opencv下(linux下是软连接,Windows下就是直接拷贝)。

    第三步:
    打开命令行cmd,进到\dlib-android\下,输入:ndk-build Test=true或者python build.py --test 回车,正常编译会得到设备ABI架构的文件,比如\dlib-android\libs\armeabi-v7a下面就有:
    在这里插入图片描述
    为了给Android Studio例子使用,你需要拷贝不同ABI架构的libandroid_dlib.so,从\dlib-android\libs目录到\dlib-android\androidstudio-examples\dlib-android-app\dlib\src\main\jniLibs目录。

    实际编译没有这么顺利吧,会报好几个错误,需要修改Android.mk和build.py(如果你用前一个命令编译也不用修改它),在Android.mk可以打log看环境变量的值,如$(info $(环境变量))

    如有不明白的地方,欢迎在此提问。

    展开全文
  • android平台编译并使用dlib人脸识别库 未完待续

    编译dlib

    新建项目,选择c++支持,在CMakeLists.txt中添加dlib:

    include(src/main/cpp/dlib/cmake)  

    再链接dlib库

    target_link_libraries( # Specifies the target library.  
                           native-lib  
                           dlib  
                           # Links the target library to the log library  
                           # included in the NDK.  
                           ${log-lib} ) 

    参考http://blog.csdn.net/hjimce/article/details/64127654

    遇到问题

    1.std::to_string
    2. error :no member named ‘round’ in namespace ‘std’; did you mean simply ‘round’?
    3. error: no type named ‘exception_ptr’ in namespace ‘std’; did you mean ‘exception’?
    都在 http://blog.csdn.net/qi_w_ip/article/details/76286216里面有很好的解答

    经验总结

    1.将dlib移植到android应该是有很多人做过的,先不急着上手编译,而应该广泛搜索解决方案。
    2.cmake很实用,早点系统学习。

    展开全文
  • dlib-android-app

    2019-01-18 15:12:55
    dlib-android-app 项目地址:tzutalin/dlib-android-app  简介::dragon: Android app to demo dlib-android(https://github.com/tzutalin/dlib-android). Use the prebuilt shared-lib built from dlib-android ...
  • 下面介绍如何把Dlib移植到Android端:1.从官网上面下载相关的Dlib。 2.解压压缩包拥有读写权限的文件夹下面。 3.把dlib(包含所有源代码)的文件夹拷贝jni文件夹下面。 4.我们需要把source.cpp文件一并...
  • 1、在cmakelist.txt中加入:include(src/main/cpp/dlib/cmake)然后再链接dlib库就可以了:target_link_libraries( # Specifies the target library. native-lib dlib
  • Android studio 2.3.3+Dlib

    2017-08-03 08:45:29
    最近因为需要,尝试着将Dlib移植到android上。android小白一枚,做之前没接触过android,所以就用了别人说比较好的android studio 最新稳定版(windows下)。在android studio2.3.3版本中使用cmake+clang来编译C/C++...
  • 后来总算找到了dlib来进行人脸识别,踩了不少坑之后,总算是集成了上去。但是官方的demo速度实在太慢,后面有空会去学习一些优化经验,这篇文章直接从编译开始讲起集成,并且使用官方demo以及机器...
  • 完成 Android 相机预览功能以后,在此基础上我使用 dlib 与 opencv 库做了一个关于人脸检测的 demo。该 demo 在相机预览过程中对人脸进行实时检测,并将检测的人脸用矩形框描绘出来。具体实现原理如下: 采用双层...
  • 参考 http://dlib.net/compile.html 1.下载源码:  http://dlib.net/files/dlib-19.6.zip   2. 编译examples cd examples mkdir build cd build cmake .. cmake --build . --config Release ...dlib a
  • 环境要求 使用AS2015平台,SDK Manager中已经安装了Cmake(编译工具),NDK(环境),LLDB(调试器)。没有装的话,打开SDK Manager选中安装重启AS就可以了。 AS项目结构: 我从不勾选C++ Support的项目开始,...
  • 本篇文章主要讲述在Android环境下基于opencv + dlib 进行人脸68个特征点提取。 分别下载dlib库和opencv库,网站如下: http://dlib.net/files/ opencv的下载请参照上篇文章。 新建Android Project ,新建时要...
  • Dlib移植到Android:http://blog.csdn.net/brightming/article/details/50595977 Dlib人脸对齐(特征点检测):http://blog.csdn.net/sunshine_in_moon/article/details/50150435   1、解压Dlib; E:\...
  • 作者的这边文章帮助很大,如果作者觉得转载有所不妥,请告知本人删除,谢谢...Dlib移植到Android:http://blog.csdn.net/brightming/article/details/50595977 Dlib人脸对齐(特征点检测):http://blog.csdn.net/
  • 参考资料:ORB_SLAM2在Android上的移植 ORB_SLAM2_Android—github OpenCV4Android 本来想直接下载github上的工程import,但是不知道为什么直接导入后eclipse直接卡死,不管怎么配置SDK、NDK、ADT各种都没用...
  • 最近在搞dlib开发,由于能力有限,没能自己通过NDK移植dlib编译出.so动态链接库,所以就自己另找出路了。 在各大论坛中,一位大神经过我三顾茅庐的请求,他给我提供了其.so文件和相关的jni接口文件,那么我就可以...
  • 本人知乎号:Ngxin-----------------------------------------------------------------------------------------------本博文旨在记录自己在做dlib人脸landmark检测时如何提高检测速度,以及在此过程中碰到的一些...
  • https://github.com/zj19941113/Face-Liveness_detection 首先,导入ndk的环境变量, 参考... mkdir ndk_build deyi@deyi-virtual-machine:~/code/face_Liveness_...
1 2 3 4 5 ... 11
收藏数 204
精华内容 81
热门标签
关键字:

dlib移植到android