Dlib系列之在iOS中提取人脸特征点(第一篇)

最近因为工作需要,在研究人脸识别,图像处理这块,这里简单记录一下。今天主要讲讲前期的准备工作,比如由C++制作OC的静态库。

什么是dlib


摘自官网:

Dlib is a modern C++ toolkit containing machine learning algorithms and tools for creating complex software in C++ to solve real world problems. It is used in both industry and academia in a wide range of domains including robotics, embedded devices, mobile phones, and large high performance computing environments. Dlib’s open source licensing allows you to use it in any application, free of charge.

简单来讲Dlib是一套包含机器学习算法的C++工具集,用来解决现实生活的问题。最为重要的就是free of charge免费。

这个C++工具集包含了很多牛逼的特性:

  • 机器学习算法
  • 数值算法
  • 图像模型接口算法
  • 图片处理
    • 高质量的人脸检测。这个部分是今天我们要用到的
  • 线程操作
  • 网络操作
  • …..

一句话,反正这个库就是牛逼。

官网文档
GitHub地址

打包成静态库

由于dlib是用c++写的,虽然xcode知识Swift、OC、C、C++混编,但是对于这种三房库最好打成静态库。

接下来就大致介绍一下如何完成这个步骤。

  • 前提条件

    1. X11(这个之前的mac是包含了的,但是现在需要自己下载安装)下载地址X11。相关的介绍可以看看这里介绍
    2. Xcode
    3. cmake,如何之前玩过c或者c++这个应该安装过了。如果没安装过可以通过homebrew安装
  • 步骤

    1. 将项目dlib clone 到本地。项目地址https://github.com/davisking/dlib.git

    2. 在终端里面打开刚才clone下来的项目里面的examples目录。

    3. 终端执行mkdir build

    4. 终端执行cd build

    5. 终端执行cmake -G Xcode ..

    6. 终端执行cmake --build . --config Release 这一步等的时间比较长,耐心一点

      如果没有出现异常,最后会出现
      这就说明成功了。

这一串命令最终会产生一个dlib_build目录,里面就是编译这个库的xcode项目。在这个项目里面可以根据你的需要设置这个SDK支持的架构和支持的平台(iOS、Mac)。

特别注意,需要额外添加一些编译标识和dlib依赖的三方库。可以直接根据examples.xcproject项目来查看具体的设置

通过上面的方式就制作好了一个包含dlib的静态库。

下面是生产.a的目录

查看.a支持的架构可以通过lipo -info xxx.a查看。比如我这里就是

将静态库添加到项目中去

刚才制作好了libdlib.a。接下来就是去使用它。

  1. 将刚才生产的.a和dlib的库文件拖到同一个文件夹。

  2. 将这两个加到项目实体中。

  3. 然后将libdlib.a拖到项目中,特别注意不要把库文件dlib目录下的文件拖进去。在文件中引用一下库文件。

#include <dlib/image_processing.h>
#include <dlib/image_io.h>

之后会报找不到头文件。

  1. 然后设置文件夹搜索

  2. 然后编译,不出意外会报如下的错。

  3. 添加需要的framework。非常重要。麻蛋让我踩了好久的坑。

  4. 然后添加Custom Compiler Flags中的Other C Flags。下面这些flag定义了在预处理阶段对libdlib.a的某些特性的宏。

    • -DDLIB_JPEG_SUPPORT
    • -DDLIB_NO_GUI_SUPPORT
    • -DNDEBUG -DDLIB_USE_BLAS
    • -DDLIB_USE_LAPACK
  5. 添加预处理宏Preprocessor Macros。

    • DLIB_JPEG_SUPPORT
    • DLIB_NO_GUI_SUPPORT
    • NDEBUG -DDLIB_USE_BLAS
    • DLIB_USE_LAPACK
  6. 现在编译就能够完全通过了。

接下来就是进行代码编写实现人脸特征点提取了。下次再讲吧!

扩展阅读

How to use dlib in Xcode C++ console application
Facial Landmark Detection
opencv2.framework not compile with linker flag -ObjC


 上一篇
基础回顾之存储类、链接与内存管理 基础回顾之存储类、链接与内存管理
做技术,越做到后面越觉得基础、底层的才是越难得,也会越有技术含量的。最近做的项目有关音视频、图像处理,涉及到的都死c和c++相关的代码。遇到了问题才发现,c和c++才是通用大法。这两块没学好,那也只有玩一玩应用层、UI这些东西。抽空整理下。
下一篇 
谈谈位枚举NS_OPTIONS 谈谈位枚举NS_OPTIONS
给别人讲问题的时候遇到类似的,顺便就复习下。 谈谈位枚举NS_OPTIONS在iOS开发中枚举大家用得最多的应该是NS_ENUM。NS_ENUM也没什么好讲的。主要来讲讲位枚举NS_OPTIONS。 下面是他们在Foundation.fr
2017-04-22
  目录