红联Linux门户
Linux帮助

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

发布时间:2017-06-08 15:31:29来源:linux网站作者:CaniculaJim
Dlib是一个C++编写的工具包,它包含了机器学习算法以及一些用来解决现实复杂问题的工具,可以广泛应用于机器人、嵌入式设备、手机,甚至高性能计算中,可以在其官网了解更多。这里下载它来试用一下,下载后解压,目录结构如下:
人脸特征检测--基于DLIB库
 
在examples目录下是C++的一些例子,我们可以参考来学习下怎么使用:
人脸特征检测--基于DLIB库
 
下面基于这个库来检测一下人脸的特征数据,使用Eclipse For CPP IDE新建一个空的C++的Makefile工程,然后新建main.cpp与makefile文件,并复制官方的人脸识别文件到工程目录下,完成后项目结构如下:
人脸特征检测--基于DLIB库
 
"shape_predictor_xxxx"就是已经弄好的人脸识别数据文件,可以搜索下载即可。
"2.png"是一张人脸,就取我的证件照吧。
为了能够跳转查看头文件,配置一下dlib库的include路径:
人脸特征检测--基于DLIB库
 
编辑main.cpp文件如下:
#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文件如下:
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参数,指向正确的路径即可。
 
编译执行结果如下:
人脸特征检测--基于DLIB库
 
左边是特征点检测结果,右边是从0到67总共68个点的特征数据本地保持,结果输出,检测完用了5.02秒,这里人脸部分图片越小,时间越短,经过Mac与Ubuntu的执行时间对比,Ubuntu比Mac居然快了1秒,而Ubuntu是运行在虚拟机上面的。
后续再用这个数据来进行分析了。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/31346.html