MATLAB调用Dlib c++接口的详细教程(Cmake+vs2017)

版权声明:转载请注明出处(作者:Ephemeroptera) https://blog.csdn.net/Ephemeroptera/article/details/83687043

大家好,我是作者蜉蝣。用过MATLAB进行视觉开发的朋友们应该都感受到了MATLAB视觉工具箱的强大,然而更为吸引人的 opencv,dlib 第三方工具往往面向C++,Python等平台。作者最近正在研究关于人脸的疲劳检测时,虽然matlab提供了人脸及五官的成熟检测模块(比如ACFObjectDetector,CascadeObjectDetector,RCNN等)以及追踪模块(KLT,Camshift等),但是因为工作需要,需要构建人脸的landmark(该M脚本目前已经有人写出(https://ww2.mathworks.cn/matlabcentral/fileexchange/47713-facial-landmarks)),为了科研方便希望能直接调用Dlib相关模块。68 landmarks

现在作者将详细告诉大家MATLAB调用DLIB的详细做法以及几个误区。

 **首先必须说明一点,最新版的Dlib版本19.16把读者坑的苦不堪言**,用Cmake生成dilb库时尝试了各种解决方案依然解决不了各种编译故障,因此作者这里建议大家采用旧版本,这里作者用的是19.1版本,因为官方网站只提供最新版本,所以相关链接稍后我会附给大家。
  1. 首先dlib官方提供了matlab调用接口的快捷生成方式,如下大致意思告诉我们按照README说明用Cmake编译就行了,可这样真的可以吗?我们且试试!

  2. 定位到dlib的matlab位置(例如:D:\dlib-19.1\dlib\matlab),打开README帮助,如下: 告诉我们在build用Cmake编译和生成目标文件(这里用Cmake命令,安装好cmake需要环境变量path添加…\cmake\bin),win+R输入cmd进入控制台,然后进入当前文件夹,操作如下:在这里插入图片描述 接下来要确定好你的编译器版本用于cmake,本人用的是vs2017即vc 15而且64位系统,所以输入命令cmake -G “Visual Studio 15 Win64” … (readme里也说了),如下在这里插入图片描述这时你会发现build文件夹下会生成很多工程文件,其实能成功编译完这些工程文件,接口就能实现,但是真的那么容易吗,我们继续下一步:输入cmake --build . --config release --target install ,失望的是:cmake并不能成功编译!在这里插入图片描述

  3. 然而不用难过,分析原因:虽然cmake在编译上可以实现一条龙服务,但是这个工程配置上依然存在很多漏洞,特别是example_mex_callback,example_mex_function, example_mex_struct 这三个项目配置上出现了问题,再看报错情况:** 无法解析的外部符号 utIsInterruptPending**,这更是缺少某个链接库的原因!接下来我们就用vs代替cmake对工程文件先纠正配置再编译。

  4. 用VS打开D:\dlib-19.1\dlib\matlab\build下的ALL _BUILD.vcproj 在左侧可以看到包含了以下工程在这里插入图片描述上面说了,主要是example_mex_function/callback/struct这三个工程编译出现问题,在修改配置之前,我们需要确定matlab所在位置,打开…/dlib/matlab下cmake_mex_wrapper文件,找到在这里插入图片描述一般matlab默认位置都在这,如果你的安装位置在别的地方,请在下一行手动添加。

  5. 接下来正式开始配置我们的工程属性啦,对那三个问题工程(example_mex_function/callback/struct)依次打开属性配置配置环境选择:Debug+x64
    (1)C/C++ ->常规->附加包含目录:添加:C:\Program Files\MATLAB\R2018a\extern\include(这是我matlab安装位置)在这里插入图片描述
    (2)链接器 ->常规->附加库目录:添加C:\Program Files\MATLAB\R2018a\extern\lib\win64\microsoft (以我的为例),如图在这里插入图片描述
    (3)链接器 ->输入->附加依赖项:添加libut.lib;libmx.lib;libmex.lib;libmat.lib;libeng.mat(文件路径可以不用写,因为附加库目录已经申明了。这里添加libut.lib即可,因为其他lib已经有了)在这里插入图片描述我们可以发现正是缺少libut.lib 才导致无法解析的外部符号 utIsInterruptPending查阅相关资料,有下列说明:在这里插入图片描述
    (4) 链接器 ->命令行:添加/EXPORT:mexFunction;如图
    在这里插入图片描述
    这里是生成入口函数,不然matlab调试会生成如下报错
    在这里插入图片描述
    (6)这里大部分配置已经完成,最后我们检查一下输出文件是不是.mexw64在这里插入图片描述
    上述我只是对example_mex_callback修改,同理另外两个问题工程也是这个操作,这样配置就大功告成啦!!!

  6. 重新生成
    既然配置我们都把修复好了,接下来我们生成一下试试吧!在这里插入图片描述
    等了些许片刻 我们看看结果
    在这里插入图片描述
    6个项目全部成功生成(其中那三个是问题项目),是不是很激动呢。这时候我们打开…/build/Debug看看生成文件,会有
    example_mex_struct.mexw64
    example_mex_function.mexw64
    example_mex_callback.mexw64
    在这里插入图片描述

  7. 用matlab试一试
    我们知道mex文件是matlab和c++混合编译的必要文件,接下来我们用matlab试试看能否成功调用,正好dlib提供了测试脚本我们试试吧!
    用matlab打开…\dlib\matlab\example.m 并将工作目录设置为当前目录
    在这里插入图片描述
    将build文件夹及其子文件夹添加到路径
    运行example.m脚本
    在这里插入图片描述
    成功运行,说明matlab成功调用dlib的c++接口!!

当然用matlab调用c++也有他的调用规则,我会在稍后的博客中给大家介绍,希望上述方案能帮助到你们,同时欢迎读者在下方留言。(本文作者:Ephemeronptera(蜉蝣),转载请注明出处谢谢)

猜你喜欢

转载自blog.csdn.net/Ephemeroptera/article/details/83687043