人脸特征检测--基于DLIB库
发布时间 :
字数:701
阅读 :
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.