人脸特征检测--基于DLIB库

Dlib是一个C++编写的工具包,它包含了机器学习算法以及一些用来解决现实复杂问题的工具,可以广泛应用于机器人、嵌入式设备、手机,甚至高性能计算中,可以在其官网了解更多。这里下载它来试用一下,下载后解压,目录结构如下:

在examples目录下是C++的一些例子,我们可以参考来学习下怎么使用:

下面基于这个库来检测一下人脸的特征数据,使用Eclipse For CPP IDE新建一个空的C++的Makefile工程,然后新建main.cpp与makefile文件,并复制官方的人脸识别文件到工程目录下,完成后项目结构如下:

  • “shape_predictor_xxxx”就是已经弄好的人脸识别数据文件,可以百度下载即可。
  • “2.png”是一张人脸,就取我的证件照吧,哈哈~

为了能够跳转查看头文件,配置一下dlib库的include路径:

编辑main.cpp文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <dlib/opencv.h>
#include <opencv2/opencv.hpp>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing/render_face_detections.h>
#include <dlib/image_processing.h>
#include <dlib/gui_widgets.h>

using namespace std;
using namespace cv;
using namespace dlib;

int
main(int argc, char *argv[], char **env) {
cout << "OpenCV Version: " << CV_VERSION << endl;

try {
Mat source = imread("2.png");

cout << "Detecting, wait a minute..." << endl;
double start = static_cast<double>(getTickCount());

frontal_face_detector detector = get_frontal_face_detector();
shape_predictor pose_model;
deserialize("shape_predictor_68_face_landmarks.dat") >> pose_model;

cv_image<bgr_pixel> cimg(source);
std::vector<dlib::rectangle> faces = detector(cimg);
std::vector<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 i = 0; i < 68; i++) {
circle(source, cvPoint(shapes[0].part(i).x(), shapes[0].part(i).y()),
3, cv::Scalar(0,0,255), -1);
}
}

double end = static_cast<double>(getTickCount());
double seconds = (end-start) / getTickFrequency();
cout << "Detect finish, time: " << seconds << endl;
imshow("Face Feature", source);

waitKey();
}
catch (exception &e) {
cout << "[Error]: " << e.what() << endl;
}

return 0;
}

编辑Makefile文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TARGET = main
SRC_FILES = main.cpp \
/home/linjk/usr/dlib-19.4/dlib/all/source.cpp
COMPILER = g++
CXXFLAGS = -Wall -std=c++11 -lX11 -lpthread
INCLUDE_DLIB = /home/linjk/usr/dlib-19.4/
LIB_PATH = /usr/local/lib/
LINK_LIBS_OPENCV = -lopencv_videoio \
-lopencv_core \
-lopencv_highgui \
-lopencv_imgproc \
-lopencv_imgcodecs

$(TARGET):$(SRC_FILES)
$(COMPILER) -o $(TARGET) $(SRC_FILES) $(CXXFLAGS)\
-I$(INCLUDE_DLIB) -L$(LIB_PATH) $(LINK_LIBS_OPENCV)

clean:
rm -rf $(TARGET)

这里定义的目标可执行文件main的编译规则,在其他平台修改这个文件的-I或-L参数,指向正确的路径即可。
编译执行结果如下:

左边是特征点检测结果,右边是从0到67总共68个点的特征数据本地保持,结果输出,检测完用了5.02秒,这里人脸部分图片越小,时间越短,经过Mac与Ubuntu的执行时间对比,Ubuntu比Mac居然快了1秒,而Ubuntu是运行在虚拟机上面的~

后续再用这个数据来进行分析了。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 linjk121@163.com.