帮我写一个用c++下用opencv4.6 dlib19.24 基于facenet实现的人脸比对项目
时间: 2023-11-27 15:54:45 浏览: 41
好的,以下是一个使用C++、OpenCV 4.6和Dlib 19.24实现的人脸比对项目。该项目基于Facenet算法,可实现两张人脸图片的相似度比对。
首先,需要安装OpenCV 4.6和Dlib 19.24,并在项目中引入它们的头文件和库文件。
然后,需要使用Dlib中的人脸检测器和Facenet模型进行人脸特征提取。具体步骤如下:
1. 加载人脸检测器和Facenet模型:
```c++
dlib::frontal_face_detector detector = dlib::get_frontal_face_detector();
dlib::shape_predictor sp;
dlib::deserialize("shape_predictor_68_face_landmarks.dat") >> sp;
dlib::anet_type net;
dlib::deserialize("dlib_face_recognition_resnet_model_v1.dat") >> net;
```
2. 对两张人脸图片进行人脸检测和特征提取:
```c++
cv::Mat img1 = cv::imread("image1.jpg");
cv::Mat img2 = cv::imread("image2.jpg");
dlib::matrix<dlib::rgb_pixel> dlib_img1, dlib_img2;
dlib::assign_image(dlib_img1, dlib::cv_image<dlib::bgr_pixel>(img1));
dlib::assign_image(dlib_img2, dlib::cv_image<dlib::bgr_pixel>(img2));
std::vector<dlib::rectangle> faces1 = detector(dlib_img1);
std::vector<dlib::rectangle> faces2 = detector(dlib_img2);
std::vector<dlib::matrix<float, 0, 1>> face1_descriptors, face2_descriptors;
for (auto face : faces1) {
auto shape = sp(dlib_img1, face);
dlib::matrix<dlib::rgb_pixel> face_chip;
dlib::extract_image_chip(dlib_img1, dlib::get_face_chip_details(shape, 150, 0.25), face_chip);
face1_descriptors.push_back(net(face_chip));
}
for (auto face : faces2) {
auto shape = sp(dlib_img2, face);
dlib::matrix<dlib::rgb_pixel> face_chip;
dlib::extract_image_chip(dlib_img2, dlib::get_face_chip_details(shape, 150, 0.25), face_chip);
face2_descriptors.push_back(net(face_chip));
}
```
3. 计算两张人脸图片的相似度:
```c++
float similarity = 0;
for (auto face1_descriptor : face1_descriptors) {
for (auto face2_descriptor : face2_descriptors) {
similarity = std::max(similarity, dlib::length(face1_descriptor - face2_descriptor));
}
}
```
上述代码中,相似度的计算使用了欧几里得距离,即两个特征向量之间的欧几里得距离越小,相似度越高。
完整的代码如下:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
#include <dlib/opencv.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing/shape_predictor.h>
#include <dlib/dnn.h>
#include <dlib/image_io.h>
int main() {
dlib::frontal_face_detector detector = dlib::get_frontal_face_detector();
dlib::shape_predictor sp;
dlib::deserialize("shape_predictor_68_face_landmarks.dat") >> sp;
dlib::anet_type net;
dlib::deserialize("dlib_face_recognition_resnet_model_v1.dat") >> net;
cv::Mat img1 = cv::imread("image1.jpg");
cv::Mat img2 = cv::imread("image2.jpg");
dlib::matrix<dlib::rgb_pixel> dlib_img1, dlib_img2;
dlib::assign_image(dlib_img1, dlib::cv_image<dlib::bgr_pixel>(img1));
dlib::assign_image(dlib_img2, dlib::cv_image<dlib::bgr_pixel>(img2));
std::vector<dlib::rectangle> faces1 = detector(dlib_img1);
std::vector<dlib::rectangle> faces2 = detector(dlib_img2);
std::vector<dlib::matrix<float, 0, 1>> face1_descriptors, face2_descriptors;
for (auto face : faces1) {
auto shape = sp(dlib_img1, face);
dlib::matrix<dlib::rgb_pixel> face_chip;
dlib::extract_image_chip(dlib_img1, dlib::get_face_chip_details(shape, 150, 0.25), face_chip);
face1_descriptors.push_back(net(face_chip));
}
for (auto face : faces2) {
auto shape = sp(dlib_img2, face);
dlib::matrix<dlib::rgb_pixel> face_chip;
dlib::extract_image_chip(dlib_img2, dlib::get_face_chip_details(shape, 150, 0.25), face_chip);
face2_descriptors.push_back(net(face_chip));
}
float similarity = 0;
for (auto face1_descriptor : face1_descriptors) {
for (auto face2_descriptor : face2_descriptors) {
similarity = std::max(similarity, dlib::length(face1_descriptor - face2_descriptor));
}
}
std::cout << "Similarity: " << similarity << std::endl;
return 0;
}
```