开源项目推荐:Dlib C++ Libraries使用说明与内存泄漏问题解决(★firecat推荐★)
发布日期:2021-06-30 18:20:47 浏览次数:3 分类:技术文章

本文共 4235 字,大约阅读时间需要 14 分钟。

Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具。它广泛应用于工业界和学术界,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。Dlib的 允许您在任何应用程序中免费使用它。Dlib有很长的时间,包含很多模块,近几年作者主要关注在机器学习、深度学习、图像处理等模块的开发。

一、官网

 源码下载

 编译说明

 

二、教程

 win10之dlib安装过程(c++调用库,非python版)

 Dlib相关问题

 Dlib机器学习库的安装和使用

 

三、我个人的VS2015环境配置(Dlib v19.1版本之后必须要VS2015才能编译)

1、使用转换生成VS2015工程。使用默认配置即可,不修改任何参数。

2、VS2015打开Dlib 程。点击dlib属性页。需要注意的地方有两处。

(1)配置属性》c/c++》常规中的附加包含目录,需要添加dlib解压文件dlib目录中external中的libjpeg,libpng,zlib三个文件目录

D:\My Resources\7-cmakeprj\dlib-19.17\dlib\external\libjpeg

D:\My Resources\7-cmakeprj\dlib-19.17\dlib\external\libpng

D:\My Resources\7-cmakeprj\dlib-19.17\dlib\external\zlib

(2)配置属性》c/c++》预处理器中的预处理器定义。需要注意是否存在

DLIB_JPEG_SUPPORT

DLIB_PNG_SUPPORT
DLIB_JPEG_STATIC

(3)Debug和Release分别编译,生成dlibd.lib和dlib.lib

3、VS2015新建新建Win32控制台应用工程,测试dlib库是否可以用。

(1)把Dlib源码包拷贝到Win32 exe工程。

(2)Win32 exe工程,配置属性》c/c++》常规中的附加包含目录

..\dlib-19.17

..\dlib-19.17\dlib\external\libjpeg
..\dlib-19.17\dlib\external\libpng
..\dlib-19.17\dlib\external\zlib

注意,千万不要包含..\dlib-19.17\dlib,否则会报错:

***\dlib\dlib-19.4\dlib\dlib_include_path_tutorial.txt(1): fatal error C1189: #error: “Don’t put the dlib folder in your include path”

(3)Win32 exe工程,配置属性》c/c++》预处理器中的预处理器定义,添加:

DLIB_JPEG_SUPPORT

DLIB_PNG_SUPPORT
DLIB_JPEG_STATIC

(4)Win32 exe工程,配置属性》链接器》常规中的附加库目录。添加dlib.lib所在文件目录

..\Dlib-19.17\Win32

(5)Win32 exe工程,配置属性》链接器》输入的附加依赖项。添加dlibd.lib和dlib.lib。

(6)如果在链接(编译一般不会有问题)的时候出现下面的问题

error LNK2001: 无法解析的外部符号 USER_ERROR__missing_dlib_all_source_cpp_file__OR__inconsistent_use_of_DEBUG_or_ENABLE_ASSERTS_preprocessor_directives

那么就需要将 dlib/all/source.cpp 该文件添加到Win32 exe项目中,注意要以添加现有项的方式直接选取该文件。

若没有出现上面的问题,则一般不需要添加该文件。

添加soure.cpp,编译会报错:

在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”

解决办法是:鼠标右键soure.cpp,属性,不使用预编译头

4、如何使用SQLite,官网下载,sqlite-amalgamation-3280000.zip

解压,自己新建工程编译成静态库,请参考:

然后把sqlite3.h拷贝到路径\Dlib-19.17\dlib\sqlite即可。

修改\Dlib-19.17\dlib\sqlite.h头文件

#include <sqlite3.h>//原来

#include "sqlite3.h" //firecat修改后

5、把\dlib-19.17\tools\visual_studio_natvis\dlib.natvis拷贝到

C:\Users\<用户名>\Documents\Visual Studio 2015\Visualizers

 

四、MFC建立项目,发现内存泄漏

使用windbg可以检测到:

1b55c8d SmartDispenser!operator new+0x0000000d1826e7e SmartDispenser!dlib::threads_kernel_shared::thread_pool+0x0000008e1539eb0 SmartDispenser!dlib::unregister_thread_end_handler
+0x0000004015c6e5a SmartDispenser!dlib::logger::global_data::~global_data+0x0000005a16557cb SmartDispenser!dlib::logger::global_data::`scalar deleting destructor'+0x0000002b15c8b51 SmartDispenser!dlib::logger::~logger+0x000000e11bf6968 SmartDispenser!dlib::logger_helper_stuff::`dynamic atexit destructor for 'log''+0x00000028

我提交的问题:

解决方法:

说白了就是Dlib-19.17\dlib\threads\threads_kernel_shared.cpp,把变量值修改一下:

//do_not_ever_destruct = true;do_not_ever_destruct = false; //firecat,Detected memory leaks

 

五、Dlib主要功能

主要特点

  • 文档丰富
    • 与许多开源项目不同的是,Dlib为每个类和功能提供了完整和精确的文档。同时它还有调试模式,可以帮助你检查使用某个函数的先决条件。启用此功能后,它将捕获由于错误地调用函数或以不正确的方式使用对象而导致的绝大多数错误。
    • 提供了许多示例程序(非常有用的示例!)
    • 我认为文档是函数库最重要的部分。因此,如果您发现任何未记录的内容,不清楚或已过时的文档,请告诉原作者,作者会及时修复它。
  • 高质量的广泛兼容的代码
    • 好的单元测试覆盖率。代码的单元测试行与库代码行之比约为1到4。
    • 该库在MS Windows,Linux和Mac OS X系统上定期进行测试。事实上,它可以在任何POSIX系统上运行,并且已经在Solaris,HPUX和BSD上使用。
    • 没有其他软件包依赖。只需要通过开箱即用的操作系统提供的底层API。
    • 在使用库之前,不需要安装或配置步骤。有关详细信息,请参阅 页面。
    • 所有操作系统特定的代码都被隔离在尽可能小的操作系统抽象层中。库的其余部分要么在OS抽象层之上分层,要么是纯ISO标准C ++。
  • 机器学习算法
    • 传统的基于SMO的支持向量机用于 和 
    • 用于大规模 和
    • 用于 和)
    • 通用工具
    • 一个
    • 解决与相关的优化问题的工具 。
    • 用于结构SVM工具
    • 用于解决结构SVM工具
    • 用于图像中结构SVM工具以及用于更强大(但更慢)的。
    • 用于图中结构SVM工具()
    • 一个大规模的实现
    • 在线算法
    • 在线算法
    • 在线核化的 /新颖检测器和离线支持矢量
    • 聚类算法: 或, 和 。
  • 数值计算算法
    • 使用表达式模板技术实现的快速对象,并且在可用时能够使用BLAS和LAPACK库。
    • 为矩阵对象定义了许多线性代数和数学运算,如 , , 等。
    • 使用, 和  技术的通用非约束非线性优化算法
    • 用于求解非线性最小二乘问题
    • 通过算法进行箱约束无导数优化
    • 的的实现
    •    
    • 用于求解和 问题的组合优化工具 以及用于查找most probable parse tree的
    • 一个对象
    • 一个对象
  • 图形模型推理算法
    • 算法在贝叶斯网络中进行精确推理。
    • 马尔可夫链monte carlo算法用于贝叶斯网络中的近似推断。
    • 在, 或 因子图中执行MAP推断的例程 。
  • 图像处理
    • 用于和 常见图像格式的例程。
    • 各种像素类型之间的自动颜色空间转换
    • 常见的图像操作,如边缘检测和形态学操作
    • , 和 特征提取算法。
    • 用于图像中的工具,包括 和 。
    • 高质量的
  • 线程
    • 该库提供了一个可移植且简单的
    • 用于线程通信的消息传递
    • 一个对象,能够生成按时间间隔排列的事件
  • 网络通信
    • 该库提供了一个可移植且简单的
    • 帮助您制作基于TCP的的对象
    • 和 对象,使TCP套接字能够与C ++ iostreams库互操作
    • 一个简单的对象,可用于将Web服务器嵌入到应用程序中
    • 用于线程通信的消息传递
    • 用于使用计算模型实现算法的工具
  • 图形用户界面
    • 该库提供了一个便携且简单的核心
    • 在核心GUI API的基础上实现了许多
    • 与许多其他GUI工具包不同,整个dlib GUI工具包是线程安全的
  • 数据压缩和完整性检查算法
    • 对象
    • 功能
    • 代表 算法部分的各种抽象对象。包括许多形式的PPM算法。
  • 测试
    • 在流行的Java日志记录器log4j之后的线程安全日志对象
    • 模块化的
    • 各种宏对测试前置条件很有用
  • 其他通用功能
    • 一个类型安全的用于在大小字节排序之间进行转换
    • 一个,能够使用各种参数和选项分析和验证命令行
    • 一个
    • 可以执行转换的对象
    • 许多
    • 许多实现不同内存池策略的对象
    • 一个工具,可以让您轻松地

 

---

C++库大全

 

 

转载地址:https://libaineu2004.blog.csdn.net/article/details/90636771 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:写了个VC++ MFC小工具,一键整理Resource.h文件,重新排序并去重复ID(★firecat推荐★)
下一篇:开源项目推荐:POCO C++ Libraries大全,含MFC的编译及使用

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月09日 16时02分11秒