OpenCV系列教程(十一)dlib人脸检测
一 人脸检测
dlib 人脸检测器参考代码:
#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 <dlib/gui_widgets.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace dlib;
using namespace std;
using namespace cv;
int main(int argc,char *argv[])
{
frontal_face_detector detector = get_frontal_face_detector();
cv::Mat mimg = cv::imread(argv[1]);
dlib::cv_image<bgr_pixel> img(mimg);
//转成 dlib 格式提取特征
std::vectorfaces = detector(img);
for (unsigned int i = 0; i < faces.size(); ++i)
cv::rectangle(mimg, cv::Rect(faces[i].left(), faces[i].top(), faces[i].width(), faces[i].width()), cv::Scalar(0, 0, 255), 1, 1, 0);
//画矩形框
cv::imshow("人脸", mimg);
cv::waitKey(0);
}
二 提取人脸特征点
dlib 官网有一个训练好的特征模型 shape_predictor_68_face_landmarks.dat,搭建环境时下载的,
人脸特征提取参考代码:
#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>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/freetype.hpp>
using namespace dlib;
using namespace std;
using namespace cv;
int main(int argc,char *argv[])
{
frontal_face_detector detector = get_frontal_face_detector();
shape_predictor sp;
//提取特征
deserialize("shape_predictor_68_face_landmarks.dat") >> sp;
cv::Mat mimg = cv::imread(argv[1]);dlib::cv_image<bgr_pixel> img(mimg);
std::vectorfaces = detector(img);
std::vector<full_object_detection> shapes;
for (unsigned long i = 0; i < faces.size(); ++i)
shapes.push_back(sp(img, faces[i]));
for (unsigned long j = 0; j < faces.size(); ++j)
if (!shapes.empty())
{
for (int i = 0; i < 68; i++)//标记特征
circle(mimg, cvPoint(shapes[j].part(i).x(), shapes[j].part(i).y()), 1, cv::Scalar(0, 255, 0), -1);
}
cv::imshow("Dlib 特征点", mimg);
waitKey(0);
}
如果要绘制出人脸特征,dlib 提供了 render_face_detections(shapes)接口,可以通过 dlib 自带 的 image_window 类进行绘制。
三 人脸识别
dlib 人脸识别采用了 Resnet 残差神经网络,识别精度高于普通神经网络,同样我们可以到官 网去下载训练好的模型 dlib_face_recognition_resnet_model_v1.dat,通过 net()接口返回 128 维 人脸特征,然后再通过目标图像也同样得到 128 维人脸特征,将两组特征进行对比即可判断出要识 别的对象。
具体实现参考代码:从图像、视频、摄像头识别出目标人物
猜你喜欢LIKE
相关推荐HOT
更多>>javabean是什么?
在Java中,JavaBean是一种符合特定规范的普通Java类,用于封装数据和提供操作数据的方法。JavaBean是一种重要的设计模式,用于实现面向对象编程...详情>>
2023-06-06 16:27:20java零基础入门到精通怎么学?
Java是一门广泛应用于企业级开发和大型应用程序的编程语言。要从零基础入门到精通Java,需要以下步骤和建议:1.学习基础知识:开始学习Java编程...详情>>
2023-06-05 17:02:00token是什么意思
Token是“令牌”的意思,它通常被用于身份验证和授权。在计算机系统中,当用户通过身份验证后,系统会颁发一个Token给用户,用于标识用户身份和...详情>>
2023-04-20 10:57:41虚函数的作用和实现原理
在父类中声明虚函数:在父类中通过在函数声明前加上 virtual 关键字来声明一个虚函数。需要注意的是,虚函数的使用需要谨慎,因为虚函数的调用...详情>>
2023-04-14 14:20:27