下载文件
Dlib下载
- 官网
http://dlib.net/
只push了最新版本;且最新版本要求vs2015 - github
https://github.com/davisking/dlib
在分支里可以找到各种版本 - 其它
http://dlib.net/files/
这里有很多版本,还有人脸数据,以及模型文件等
cmake下载
- 版本数:需要2.8及以上
- 官网:https://cmake.org/download/
OpenCV
关于OpenCV就不在赘述了,很简单;
C++相关配置:利用CMake编译
- 首先在解压后的dlib根目录下新建一个文件夹,我这里命名为build2013x64,因为我这里使用vs2013,64位
- 如果你的vs是32位,请选择win32,64位则选择win64
- 选择完毕,点击‘Configure’,出现configure done,再点击‘Generate’
编译完成。 - 点击‘Open Project’,打开工程
- 如果你是64位,记得一定要将设备管理器平台改为x64
- 找到ALLBuild,右键工程名,点击‘生成’
- 这个过程中报了一条错误:basetsd.h(72): error C2371: “INT32”: 重定义;不同的基类型
- 解决方法:参考这篇article
http://blog.csdn.net/zhangxiangweide/article/details/76718686 - 重新生成,ok, 没有问题,打开你的dlib下你刚创建的文件夹,找到debug文件夹,会看到生成有dlib的lib文件:dlib.lib,这个文件就是我们要用的库文件
dlib的使用
vs2013的相关配置:OpenCV和Dlib
- 包含目录
- 库目录
- 附加依赖项
测试:人脸检测及对齐
#include "stdafx.h"
#include <iostream>
#include <dlib/opencv.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing/render_face_detections.h>
#include <dlib/image_processing.h>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
dlib::frontal_face_detector detector = dlib::get_frontal_face_detector();
dlib::shape_predictor pose_model;
dlib::deserialize("D:\\zhlWorkDocs\\dl\\faceRecognition\\detection\\faceDetect\\Dlib\\shape_predictor_68_face_landmarks.dat") >> pose_model;
cv::Mat img = imread("D:\\zhlWorkDocs\\testWorksDemo\\detectface\\faceRecognition\\test_image\\test.jpg", 1);
dlib::cv_image<dlib::bgr_pixel> cimg(img);
double t = GetTickCount();
vector<dlib::rectangle> faces = detector(cimg);
cout << "dlib detect face time is: " << (GetTickCount() - t) / getTickFrequency() << endl;
vector<dlib::full_object_detection> shapes;
for (unsigned long i = 0; i < faces.size(); i++)
{
shapes.push_back(pose_model(cimg, faces[i]));
}
if (!shapes.empty())
{
for (int j = 0; j < shapes.size(); j++)
{
for (int i = 0; i < 68; i++)
{
circle(img, cv::Point(shapes[j].part(i).x(), shapes[j].part(i).y()),
3, Scalar(0, 255, 0), -1);
//putText(img, to_string(i), cv::Point(shapes[0].part(i).x(), shapes[0].part(i).y()),
// CV_FONT_HERSHEY_SCRIPT_SIMPLEX, 1, Scalar(0, 0, 255), 1, 4);
}
}
}
imshow("show_point", img);
waitKey();
return 0;
}
运行结果:
从结果上来看,Dlib的效果其实并不是想象中的那么好,漏检率很高,只检测到了10个人脸,显然对大倾斜角度,遮挡半边脸的这种情况无法很好检测,相比于MTCNN的效果差了好多,但是速度比MTCNN快,对这幅图而言,检测时间为12个毫秒;果然是鱼和熊掌不可兼得啊。