c++ dlib + opencv + facenat 进行人脸比对
时间: 2023-08-14 16:06:23 浏览: 123
人脸比对可以通过dlib和OpenCV库来实现。首先,你需要使用OpenCV库来加载图像并检测人脸。然后,你可以使用dlib库中的人脸识别模型来计算人脸的128位向量,这个向量可以表示人脸的独特特征。最后,你可以使用facenet模型将这些特征向量进行比对,以判断两个人脸是否相同。
以下是一个基本的示例代码:
```c++
#include <dlib/opencv.h>
#include <dlib/image_processing.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/dnn.h>
#include <opencv2/opencv.hpp>
using namespace dlib;
using namespace std;
// 加载facenet模型
net_type net = dlib::deserialize("models/facenet.dat");
// 计算人脸特征向量
matrix<float,0,1> get_face_descriptor(cv::Mat img, frontal_face_detector detector, shape_predictor sp) {
cv_image<bgr_pixel> cimg(img);
std::vector<rectangle> faces = detector(cimg);
std::vector<full_object_detection> shapes;
for (unsigned long i = 0; i < faces.size(); ++i) {
shapes.push_back(sp(cimg, faces[i]));
}
matrix<rgb_pixel> face_chip;
extract_image_chip(cimg, get_face_chip_details(shapes[0]), face_chip);
matrix<float,0,1> face_descriptor = net(face_chip);
return face_descriptor;
}
// 计算两个人脸特征向量的距离
double face_distance(matrix<float,0,1> &face_descriptor1, matrix<float,0,1> &face_descriptor2) {
return length(face_descriptor1 - face_descriptor2);
}
int main(int argc, char** argv) {
// 加载人脸检测模型和特征点定位模型
frontal_face_detector detector = get_frontal_face_detector();
shape_predictor sp;
deserialize("models/shape_predictor_68_face_landmarks.dat") >> sp;
// 加载两张需要比对的人脸图片
cv::Mat img1 = cv::imread(argv[1]);
cv::Mat img2 = cv::imread(argv[2]);
// 计算两个人脸的特征向量并计算距离
matrix<float,0,1> face_descriptor1 = get_face_descriptor(img1, detector, sp);
matrix<float,0,1> face_descriptor2 = get_face_descriptor(img2, detector, sp);
double distance = face_distance(face_descriptor1, face_descriptor2);
// 输出结果
cout << "Distance: " << distance << endl;
return 0;
}
```
你需要将上面的代码保存为一个cpp文件,并且需要下载facenet模型和dlib的人脸检测模型和特征点定位模型。你可以在dlib的官方网站上下载这些模型,然后将它们放在一个名为models的文件夹中。