dlib人脸关键点提取库,拥有准确的提取精度,但是dlib人脸关键点提取库对于C++以及OpenCV具有很好的支持,对于matlab的支持较少,为了可以在matlab平台上使用dlib进行人脸关键点的提取,需要将dlib人脸关键点提取的代码编译成可供matlab 2018b平台使用的.mexw64文件,本文基于VS2015和Matlab 2018b在Windows 10平台下进行,本文所用的dlib为19.16。
首先定位到dlib所在的matlab文件夹,在我电脑上为E:\package\dlib-19.16\dlib\matlab,在该文件夹下,新建一个build文件夹,存放编译后文件,之后在E:\package\dlib-19.16\dlib\matlab路径下,新建dlib人脸关键点检测的程序,命名为facelandmarks.cpp,同时,对该文件夹下的cmake_mex_wrapper文件以及CMakeLists.txt文件进行修改,对cmake_mex_wrapper文件修改的目的是:增加Matlab的运行bin,以我的为例的结果如下所示;
对CMkaeLists.txt进行修改,修改目的是:增加对 facelandmarks.cpp文件的编译,使之可以编译成为一个.sln文件,修改结果如下所示:
接下来,打开cmake-gui 3.11.4版本,如下所示:
首先选择source code,即要编译的源码的位置,之后,设置编译后文件的位置,点击Configure,配置为VS2015的编译环境,当程序编译完成后,点击Generate,生成.vcxproj文件,生成结果如下所示:
打开ALL_BUILD.vcxproj文件,结果如下所示:
此时,如果在ALL_BUILD上右键,重新生成项目,一定会出现各种各样的问题,所以这个时候需要按照如下的方式进行,当按照如下的方式完成后,可以得到最后想要的文件,出现问题的原因是少了所需要库的支持,出现问题的工程有如下的四个:example_mex_callback、example_mex_function、example_mex_struct以及face_landmarks,对于这四个工程出现的问题都一样,因此接下来,仅以face_landmarks为例,进行工程的配置, 剩下的三个配置方式相同。
右键点击face_landmarks工程,点击属性,在debug x64下进行,找到C/C++下的附加包含目录,包含如下文件:
接着点击链接器->常规->附加库目录,在附加库目录添加matlab的lib,以我的为例,结果如下:
接着,链接器->输入->附加依赖项,添加库文件,结果如下所示:
主要是添加libut.lib和libmat.lab,添加上这两个文件后,就不会出现不认识外部符号的定义,最后一步在命令行中添加命令行选项:
此时,一个工程完成,按照同样的方法,对剩下的三个工程进行配置。
当工程配置完成后,进行编译,编译完成后,会出现一个工程编译不成功,这个无所谓,因为我们需要的文件已经编译出来,编译后的文件如下形式:
此时,已经得到我们需要的.mexw64文件。接下来,在matlab 2018b中,添加上路径,如下所示:
点击添加并包含文件夹,将编译后的build下的所有文件进行包含。此时成功进行包含。对编译后的文件进行测试,首先利用dlib自带的example文件进行测试:
出现如下结果,证明调用成功:
接着,对face_landmarks,人脸68点标定文件进行测试,测试结果如下:
大功告成,可以成功调用。
此时还有 一个没有说,就是如何编写程序,由于matlab和VS对于数据的格式要求不一样,我们首先要知道对应的格式,在example_mex_function.cpp文件中,有对数据格式的说明,即:
对于face_landmarks进行编辑,必须要有一个主函数,该主函数不是main,如下所示:
第一行为传入的是彩色图像,第二行为存储的人脸,第三行为68个特征点。接下来可以进行各自需要的程序编写工作了。