判断两张人脸图片是否是同一个人的任务通常被称为人脸识别(Face Recognition),OpenCV提供了一些现成的工具和方法来解决这个问题。下面是一个基本的C++代码示例:
#include <opencv2/opencv.hpp>
using namespace cv;
// 加载图像并对其进行预处理
Mat preprocessImage(Mat image) {
// 将图像转换为灰度图像
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
// 对灰度图像进行直方图均衡化
equalizeHist(gray, gray);
// 对图像进行缩放,保证尺寸一致
resize(gray, gray, Size(128, 128));
return gray;
}
int main() {
// 加载两张图像
Mat image1 = imread("image1.jpg");
Mat image2 = imread("image2.jpg");
// 预处理图像
Mat preprocessedImage1 = preprocessImage(image1);
Mat preprocessedImage2 = preprocessImage(image2);
// 创建人脸检测器对象
CascadeClassifier faceDetector("haarcascade_frontalface_alt.xml");
// 用人脸检测器检测人脸区域
std::vector<Rect> faces1, faces2;
faceDetector.detectMultiScale(preprocessedImage1, faces1);
faceDetector.detectMultiScale(preprocessedImage2, faces2);
// 如果检测到的人脸数不是1,则认为不是同一个人
if (faces1.size() != 1 || faces2.size() != 1) {
std::cout << "Not the same person." << std::endl;
return 0;
}
// 创建人脸识别器对象
Ptr<FaceRecognizer> recognizer = EigenFaceRecognizer::create();
// 加载训练好的人脸识别模型
recognizer->read("model.yml");
// 将图像转换为一维向量
Mat imageVector1 = preprocessedImage1.reshape(1, 1);
Mat imageVector2 = preprocessedImage2.reshape(1, 1);
// 对图像进行人脸识别
int label1 = -1, label2 = -1;
double confidence1 = 0.0, confidence2 = 0.0;
recognizer->predict(imageVector1, label1, confidence1);
recognizer->predict(imageVector2, label2, confidence2);
// 如果两个图像的标签相同,则认为是同一个人
if (label1 == label2) {
std::cout << "Same person." << std::endl;
} else {
std::cout << "Not the same person." << std::endl;
}
return 0;
}
在这个示例中,首先加载了两张图片,然后对它们进行预处理(包括灰度化、直方图均衡化和缩放),接下来使用Haar级联分类器检测每张图像中的人脸区域。如果检测到的人脸数不是1,则认为不是同一个人。接着创建了一个EigenFaceRecognizer对象,加载了训练好的人脸识别模型,并将预处理后的图像转换为一维向量进行人脸识别。如果两个图像的标签相同,则认为是同一个人。
ChatGPT 记录