好久不见,没想到吧!这个鬼东西居然还有后续233

前面三篇文章搞了大致的处理流程,但是有个非常重要的问题还没解决——我们的人脸特征点(landmarks)是手动标定的。特征点在实际使用中自然是需要自动标定的,经过网上查找有个C++库称为Dlib可以解决自动标记68个landmark的问题,这就是我们要找的东西。

然而正如封面的截图,Dlib是C++上的库,而我们这里用的处理语言又是matlab,解决方法就是进行matlab与C++的混合编译。

本文的内容便是重复了一次中关于Dlib的混合编译操作并记录下了一些遇到的问题。当前的最终的目标效果就是将C++的函数编译为matlab可用的mex文件并测试一下,还不能得到。

一.CMake准备

首先准备好要用到的CMake工具和Dlib(此处使用Dlib19.1),,分别可以从下面两个链接下载

下载完成后先安装CMake,绝大多数内容都可以按照默认值直接安装。

不过为了方便起见,可以在安装的下图这里勾上为当前用户(甚至所有用户)添加环境变量,省去手动添加的烦恼。忘记勾选也没关系,在控制面板\所有控制面板项\系统\高级系统设置\环境变量\Path中加入安装好的CMake的bin文件夹路径即可。

一路安装完成后保险起见可以重启下电脑,然后cmd中输入cmake得到了对应的反应便表示完成了cmake的安装。

二.Dlib准备

接下来打开下载好的dlib19.1,解压缩到喜欢的地方后打开里面的文件夹dlib19.1\dlib\matlab,可以看到文件夹里有关于Matlab安装的README文件和结尾要用来测试的example.m文件。

打开README.txt文件可以看到里面的安装提示,其中能发现最重要为以下几句话:

按照其所提示的打开cmd,先将文件夹跳转到当前解压出的dlib-19.1\dlib\matlab中,然后使用其所提示的这几个命令。

其中由于我们接下来要用vs来编译所以要按照要求把cmake ..命令改为对应格式。这里所用的VS序号需要按照下表来调整,例如我的电脑是VS2015就需要将命令改为cmake -G "Visual Studio 14 Win64" ..

要注意如果一开始输错了的话要按照要求删去build目录中的CMakeCache.txt文件再重试。等待命令运行完可以看到结果如下

其中可能会报出CUDA找不到之类的错误,但这无伤大雅。

完成这一步后再尝试使用cmake --build . --config release--target install来安装dlib。如果可以一次搞定那就皆大欢喜,但是很可能会出现下图的报错,不要慌张,这个问题按照下面的流程来调整可解决。

三.配置调整

首先能看到有几个“无法解析的外部符号”,很自然的猜测是工程配置的问题。先打开dlib-19.1\dlib\matlab中的cmake_mex_wrapper文件,确认一下Matlab的地址是否是文件内的地址(如果之前安装Matlab使用的是默认地址则这部分不需要改动),如果有更改过需要调整下这几行。

然后使用VS加载dlib-19.1\dlib\matlab\build里的工程文件ALL_BUILD.vcxproj,这里需要调整如下的三个example项目的属性,接下来的流程步骤较杂乱,慢慢一步步做。

先右键打开一个项目的属性,在链接器-附加库目录中加入matlab的include文件夹(例如我此处为C:\Program Files\MATLAB\R2018a\extern\include)

然后顺便检查下附加包含目录是否也已经正确设置

接下来在链接器-输入的附加依赖项增加libut.lib如图,记得要么输入完整目录要么设置好继承值,这一步是重中之重。

再在链接器-命令行中加入/EXPORT:mexFunction如图。

最后检查输出的目标文件是否确实是.mexw64。

至此就是项目需要调整的配置,将以上几个步骤重复给三个example项目都设置一次。看起来很复杂的步骤实际上做起来并不会消耗太多时间,然后将总项目右键重新生成。

等待一段时间后可以在输出窗口中看到之前生成失败的项目都已经成功生成了!

四.结果测试

最后进行测试,先打开dlib-19.1\dlib\matlab\build\Debug(如果刚才是使用了Debug生成的话),可以看到是否成功生成了Matlab可以使用的.mexw64文件。

然后打开Matlab测试。刚开始的时候提到dlib-19.1\dlib\matlab文件夹中准备了一个example.m脚本,用matlab打开它,更换好当前文件夹目录。

然后将上面刚编译好的build目录及子目录加入matlab的搜索路径中。

大胆运行example,如果成功输出,到这里为止Dlib的混合编译就算是完成了。

这篇没什么好后记的,其实都是按照文章做了一次而已,没遇到什么难解决的坑。

接下来会按照同个作者的另一篇文章来试试看编写适合matlab的Dlib接口,真正做到让matlab自动标定特征点。

寒假也很忙呢,摸了:)