使用 c++ facenet 做人脸比对的例子
时间: 2023-08-28 11:05:05 浏览: 129
人脸比对是指将两张人脸图像进行比较,判断它们是否属于同一个人。Facenet是一个经典的人脸识别模型,它可以将人脸图像转化为一个固定长度的向量,从而方便进行比较。
下面是一个使用C++实现人脸比对的例子,其中我们使用了dlib库来进行人脸检测和特征提取,以及OpenCV库来进行图像读取和显示。
```c++
#include <iostream>
#include <dlib/opencv.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace dlib;
int main()
{
// 加载Facenet模型
deserialize("models/dlib_face_recognition_resnet_model_v1.dat") >> net;
// 加载图片
cv::Mat img1 = cv::imread("img1.jpg");
cv::Mat img2 = cv::imread("img2.jpg");
// 创建cv_image对象
cv_image<bgr_pixel> cimg1(img1);
cv_image<bgr_pixel> cimg2(img2);
// 初始化人脸检测器
frontal_face_detector detector = get_frontal_face_detector();
// 检测人脸
std::vector<rectangle> dets1 = detector(cimg1);
std::vector<rectangle> dets2 = detector(cimg2);
// 提取人脸特征向量
std::vector<matrix<float,0,1>> face_descriptors1;
std::vector<matrix<float,0,1>> face_descriptors2;
for (auto&& face_rect : dets1)
{
auto shape = sp(cimg1, face_rect);
matrix<rgb_pixel> face_chip;
extract_image_chip(cimg1, get_face_chip_details(shape,150,0.25), face_chip);
face_descriptors1.push_back(net(std::move(face_chip)));
}
for (auto&& face_rect : dets2)
{
auto shape = sp(cimg2, face_rect);
matrix<rgb_pixel> face_chip;
extract_image_chip(cimg2, get_face_chip_details(shape,150,0.25), face_chip);
face_descriptors2.push_back(net(std::move(face_chip)));
}
// 计算两个人脸的欧氏距离
double dist = length(face_descriptors1[0]-face_descriptors2[0]);
// 显示图片和距离
cv::imshow("img1", img1);
cv::imshow("img2", img2);
cout << "distance = " << dist << endl;
cv::waitKey();
return 0;
}
```
在这个例子中,我们首先加载了Facenet模型,并且使用dlib库中的人脸检测器检测出了图像中的人脸。然后,我们使用Facenet模型提取出了每张人脸的特征向量,并计算了它们之间的欧氏距离。最后,我们使用OpenCV库显示了原始图片,并输出了距离。
需要注意的是,这个例子只比较了两张图片中的第一个人脸,如果需要比较多个人脸,可以在循环中对每个人脸进行处理。此外,为了简化代码,我们假设每张图片中只有一个人脸,如果有多个人脸,需要对每个人脸进行处理。
阅读全文