dlib是一个C++工具包(dLIB中也有Python接口,但是主要编程语言为C++),包含绝大多数常用的机器学习算法,许多图像处理算法和深度学习算法,被工业界和学术界广泛应用于机器人、嵌入式设备、移动电话和大型高性能计算环境等领域。dlib的开源许可允许您在任何应用程序中免费使用它。在工程实践中,dlib通常和OpenCV结合使用,OpenCV提供图像处理算法,dlib提供机器学习算法。对于从事计算机视觉行业的人,非常推荐学习使用dlib。本文主要讲述dlib在Windows(win10)和linux(ubuntu18.04)下面向C++的编译安装调用。dlib具体介绍见其官网dlib官网

1 资源

在dlib的github仓库下载对应版本文件。链接地址为:dlib。此外,在使用dlib中需要使用dlib提供的模型,下载地址见dlib-models。如果网速太慢,可以看看gitee备份。地址为:dlib-giteedlib-models-gitee

本文判断dlib是否成功编译的示例代码为dlib\examples目录下的3d_point_cloud_ex.cpp。调用该示例代码后会可视化一个简单的3维点云数据。
代码如下:

// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
/* This is an example illustrating the use of the perspective_window tool
in the dlib C++ Library. It is a simple tool for displaying 3D point
clouds on the screen. */ #include <dlib/gui_widgets.h>
#include <dlib/image_transforms.h>
#include <cmath> using namespace dlib;
using namespace std; // ---------------------------------------------------------------------------------------- int main()
{
// Let's make a point cloud that looks like a 3D spiral.
std::vector<perspective_window::overlay_dot> points;
dlib::rand rnd;
for (double i = 0; i < 20; i+=0.001)
{
// Get a point on a spiral
dlib::vector<double> val(sin(i),cos(i),i/4); // Now add some random noise to it
dlib::vector<double> temp(rnd.get_random_gaussian(),
rnd.get_random_gaussian(),
rnd.get_random_gaussian());
val += temp/20; // Pick a color based on how far we are along the spiral
rgb_pixel color = colormap_jet(i,0,20); // And add the point to the list of points we will display
points.push_back(perspective_window::overlay_dot(val, color));
} // Now finally display the point cloud.
perspective_window win;
win.set_title("perspective_window 3D point cloud");
win.add_overlay(points);
win.wait_until_closed();
} // ----------------------------------------------------------------------------

2 Windows下C++编译安装调用dlib

Windows下的编译使用很简单,不需要其他的额外安装库,直接拉取dlib的仓库就行了。本文将dlib仓库放在D:\packages\dlib路径下,然后通过cmake和vs2017编译使用dlib。这一部分参考文章【C++】VS2019+Dlib安装及整合详细步骤

2.1 编译

step1
在D:\packages\dlib路径下创建build文件夹和install文件夹,build文件夹用于存放相关编译数据,install保存最后需要调用的生成文件。文件结构如下图所示:

step2
打开cmake-gui,配置dlib库。cmake安装地址为:cmake。打开cmake-gui后设置源代码目录地址和生成文件地址,点击configure。如图所示:

然后配置编译器,选择对应的编译器版本,再选择编译平台版本x64。最后点击finish,cmake将会自动编译文件。

在编译过程会出现找不到cuda的情况,忽视就行了。然后注意将指定的安装目录CMAKE_INSTALL_PREFIX这一项改为D:\packages\dlib\install。然后再点击configure,如果没有标红,点击generate。

step3
生成相关文件,generate成功后打开OpenProject即可,这样就会打开vs2017。 如下图所示:

打开后的vs2017界面如下图所示,确定编译平台为debug/x64,然后点击生成-生成解决方法即可,如下图所示。这样的好处是知道哪些模块生成失败。如果有生成译错误,检查即可。这一过程约3分钟,不同机器时间不一样。

生成成功后,如下图所示。可以有生成跳过,但是不能有生成失败。

如果生成后没有失败的,选择解决方案-INSTALL-仅用于项目-仅生成INSTALL,如下图所示:

此外以上操作只能生成dlib Debug版本。Release版本需要修改配置平台,重复以上操作。如下图所示:

最后如果install文件夹中有include文件夹和lib文件夹,表明编译过程成功。如下图所示:

在windows平台下,某些情况下dlib会使用libjpeg,libpng模块,可能会出现链接libjpeg错误的情况。如果你使用的是anaconda,dlib会自动链接anconda的libjpeg,libpng模块。这些模块是32位的,你只能用x86的dlib版本,否则出错。如果是想用x64平台,需要自己编译第三方模块的x64版本,比如libpng,libjpeg,zlib。github搜索这些模块,然后编译后。用visual studio的命令行开发工具,进入build目录,自行指定libjpeg等链接文件,再进行编译。其中dlib要链接的第三方库自行指定目录(目前看来这一种解决办法),具体命令如下:


# Visual Studio 15 2017指vs2017,vs2015用Visual Studio 14 2015,vs2019用Visual Studio 16 2019
# -DCMAKE_INSTALL_PREFIX=../instal 编译文件安装目录
cmake -G "Visual Studio 15 2017" -DJPEG_INCLUDE_DIR=..\dlib\external\libjpeg -DJPEG_LIBRARY=..\dlib\external\jpeg.lib -DPNG_PNG_INCLUDE_DIR=..\dlib\external\libpng -DPNG_LIBRARY_RELEASE=..\dlib\external\libpng.lib -DZLIB_INCLUDE_DIR=..\dlib\external\zlib -DZLIB_LIBRARY_RELEASE=..\dlib\external\z.lib -DDLIB_GIF_SUPPORT=OFF -DCMAKE_INSTALL_PREFIX=../install -DCMAKE_GENERATOR_PLATFORM=x64 .. # 编译debug版本
cmake --build . --target INSTALL # 编译release版本
cmake --build . --config Release --target INSTALL

2.2 配置与使用

新建vs2017项目,然后选择属性管理器,新建属性列表dlib如下图所示。这样该dlib属性列表以后可以重复导入使用,不需要每次新建工程都配置。

修改Release|X64模式下的dlib属性,修改VC++目录下的可执行目录,库目录。如下图所示:

包含目录设置如下,添加头文件:

D:\packages\dlib\install\include

库目录设置如下:

D:\packages\dlib\install\lib

然后修改链接器-输入-附加依赖项,如下图所示:

附加依赖项设置如下。注意不同版本dlib编译生成的lib不一样,注意区分,如果是debug就调用相应的debug版本,都在install\lib目录下。

dlib19.22.99_release_64bit_msvc1916.lib

然后调用本文在第一节提到的示例代码3d_point_cloud_ex.cpp文件,结果如下图所示,就是一个展示3维点云的代码,可以拖动或放大缩小图形。

3 Ubuntu下C++编译安装调用dlib

3.1 编译

ubuntu下编译使用dlib比windows下稍微复杂,因为ubuntu缺少一些dlib所需要的库,有时会出现莫名其妙的错误,一般来说都是缺少图形显示库,比如linux下dlib需要x11图像化界面(windows不需要,其他系统图像化界面可能不一样),所以先安装x11。如果不安装可能会出现X11相关错误。这一部分参考文章ubuntu下使用 dlibcmake-cant-find-x11

sudo apt-get install libx11-dev

然后进入dlib根目录,输入以下命令:

mkdir build; cd build; cmake … -DUSE_AVX_INSTRUCTIONS=1; make -j12

上述命令会编译AVX,来加速CPU运行,如果出现错误使用以下命令编译:

mkdir build; cd build; cmake …; make -j12

3.2 配置与使用

新建一个文件夹dlib-test,将3d_point_cloud_ex.cpp复制到该文件夹。进入该文件夹,新建CMakeList.txt文件,CMakeList.txt内容如下。注意CMake文件链接dlib库的路径地址

cmake_minimum_required(VERSION 2.8.12)
# 工程名
project(dlib_test) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O2 -DDLIB_JPEG_SUPPORT") IF(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything")
ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
ENDIF() # 包含OpenCV
find_package(OpenCV REQUIRED)
if (OpenCV_FOUND)
include_directories(${OpenCV_INCLUDE_DIRS})
message("OpenCV found")
endif() # 包含X11
find_package(X11 REQUIRED)
if (X11_FOUND)
include_directories(${X11_INCLUDE_DIR})
message("X11 found")
endif() # 添加dlib
include_directories(/home/{yourpath}/dlib)
link_directories(/home/{yourpath}/dlib/build/dlib/) # 添加代码
add_executable(dlib_test 3d_point_cloud_ex.cpp)
# 链接库
# libdlib.a - lpthread - lX11分别表示链接dlib,多线程,X11
target_link_libraries(dlib_test ${OpenCV_INCLUDE_LIBS} ${X11_LIBRARIES} libdlib.a -lpthread -lX11)

然后输入以下命令,即可编译运行示例代码:

mkdir build; cd build; cmake …; make -j12; ./dlib_test

如果出现第二节的三维点云图形,表明dlib安装成功。

4 Python安装调用dlib

通常直接用pip install dlib会出错,所以需要安装一系列的库,主要是cmake、Boost。具体如下:
windows:

pip install cmake
pip install boost
pip install dlib

如果发现编译失败,看看python–3.8安装dlib,直接通过whl包安装dlib也行

linux:

sudo apt-get install libx11-dev
sudo apt-get install libboost-all-dev
sudo apt-get install cmake
python3 -m pip install dlib

安装成功后,在python环境import dlib即表明安装成功,当然也可以编译安装,具体步骤见官方仓库文档。

5 参考

[常用工具] dlib编译调用指南的更多相关文章

  1. GCC 编译优化指南(转)

    GCC 编译优化指南(转) http://www.jinbuguo.com/linux/optimize_guide.html 作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然 ...

  2. GCC 编译优化指南

    转自: http://www.jinbuguo.com/linux/optimize_guide.html GCC 编译优化指南 作者:金步国[www.jinbuguo.com] 版权声明 本文作者是 ...

  3. GCC编译优化指南【作者:金步国】

    GCC编译优化指南[作者:金步国] GCC编译优化指南 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分 ...

  4. 第二章 Qt常用工具的介绍

    第二章 Qt常用工具的介绍 (1)No.1 qmake 相信编写过Makefile的开发人员,随着工程中源码的级数递增和以类型.功能.模块组织源码的子目录的增多,都不愿意重复机械地手工编写这个工程管理 ...

  5. Java监控常用工具 .

    Java的安装包自带了很多优秀的工具,善用这些工具对于监控和调试Java程序非常有帮助.常用工具如下: jps 用途:jps用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等. ...

  6. cmake编译opencv指南

    目录 cmake编译opencv指南 用包管理器安装 查看opencv相关的包 执行安装 编译安装 为什么编译安装 下载源码 编译脚本 执行编译脚本.解决3rdparty下载 编译后的设定-环境变量 ...

  7. 学习游戏服务器开发必看,C++游戏服务器开发常用工具介绍

    C++游戏服务器开发常用工具介绍 在软件开发过程中需要使用的工具类型实属众多,从需求建模到软件测试,从代码编译到工程管理,这些工具都对项目有着不可替代的作用.庄子有云,"吾生也有涯,而知也无 ...

  8. java面试复习重点:类的管理及常用工具,教你抓住面试的重点!

    java复习: 类的管理及常用工具类 包 写在程序文件的第一行 一个Java 源文件中只能声明一个包, 且声明语句只能作为源文件的第一条指令 导入类能导入非public类,但是不能用因为在其他包缺省的 ...

  9. C++常用工具库(C语言文件读写,日志库,格式化字符串, 获取可执行文件所在绝对路径等)

    前言 自己常用的工具库, C++ 和C语言实现 使用cmake维护的项目 持续更新..... 提供使用范例, 详见example文件夹 windows使用的VS通过了的编译. Linux(Ubuntu ...

随机推荐

  1. Persistent data structure 不可变数据结构

    持久性变数据不要和持久储存相混淆 在计算机中持久性数据或非临时数据是一种数据结构,在修改时始终保持其自身的先前版本.这些数据实际上是不可变的,因为对这类数据操作不会明显的改变数据结构,而是始终产生新的 ...

  2. Spring Ioc容器xml配置

    Spring Ioc容器xml配置基本结构: <?xml version="1.0" encoding="UTF-8"?> <beans xm ...

  3. Windows开启关闭测试模式的方法(含开启测试模式失败的解决办法)

    前言:           内含:Windows开启关闭测试模式的方法.开启测试模式失败的解决办法.win10进入bios的方式.BitLocker恢复方式.           对于互联网从业者来说 ...

  4. Vue学习之--------深入理解Vuex之getters、mapState、mapGetters(2022/9/3)

    这一篇博客的内容是在上一篇博客的基础上进行:深入理解Vuex.原理详解.实战应用 @ 目录 1.getters的使用 1.1 概念 1.2 用法 1.3 如何读取数据 2.getters在项目中的实际 ...

  5. Java实现7种常见密码算法

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 前面在密码学入门一文中讲解了各种常见的密码学概念.算法与运用场景,但没有介绍过代码,因此,为作补充,这一篇将会介绍 ...

  6. JUC中的AQS底层详细超详解

    摘要:当你使用java实现一个线程同步的对象时,一定会包含一个问题:你该如何保证多个线程访问该对象时,正确地进行阻塞等待,正确地被唤醒? 本文分享自华为云社区<JUC中的AQS底层详细超详解,剖 ...

  7. 构建LNP镜像

    1.构建ubuntu-base环境  #10.0.0.28:  [root@rocky8 ubuntu_base]#vim Dockerfile  FROM ubuntu:20.04  LABEL m ...

  8. vs 自定义代码块

    代码自动生成,让代码飞~ 我目前用的是vs2013,c,c++用的多,vs自带了一套代码块规则,下面我们就以for举例子. 1 原生代码块怎么使用 输入for后按Tab键: 这时候可以修改 size_ ...

  9. K8S节点配置资源驱逐

    #参考文章:https://www.cnblogs.com/zhangrui153169/p/15726165.html 当节点内存到达多少时.对节点的pod进行驱逐 [root@lecode-tes ...

  10. windows 使用ACR122U-A9设备读写M1卡

    软件地址 M1卡服务程序 安装好驱动后就可以破解,破解成功后的秘钥会显示出来(记录下来),同级目录会生成一个dump文件,这个文件包含此M1卡的全部数据,可以使用hexedit打开,编辑或修改 Mif ...