#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
int main(int argc,char** argv)
{
// 加载人脸检测器
cv::CascadeClassifier faceCascade;
if (!faceCascade.load("haarcascade_frontalface_default.xml")) {
std::cerr << "Error: Failed to load face cascade." << std::endl;
return 1;
}
// 加载预先保存的人脸图像
cv::Mat knownFace = cv::imread("myImg.jpg");
if (knownFace.empty()) {
std::cerr << "Error: Failed to load known face image." << std::endl;
return 1;
}
// 打开摄像头
cv::VideoCapture cap(1);
if (!cap.isOpened()) {
std::cerr << "Error: Failed to open camera." << std::endl;
return 1;
}
// 创建窗口
cv::namedWindow("Face Detection", cv::WINDOW_NORMAL);
// 循环读取并显示摄像头视频,并进行人脸检测和比对
while (true) {
// 读取帧
cv::Mat frame;
cap >> frame;
// 检查是否成功读取帧
if (frame.empty()) {
std::cerr << "Error: Failed to read frame." << std::endl;
break;
}
// 转换为灰度图像
cv::Mat gray;
cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
// 检测人脸
std::vector<cv::Rect> faces;
faceCascade.detectMultiScale(gray, faces, 1.1, 4);
// 在图像上绘制检测到的人脸,并进行比对
for (const auto& face : faces) {
// 在图像上绘制检测到的人脸
cv::rectangle(frame, face, cv::Scalar(0, 255, 0), 2);
// 检查人脸区域是否在图像范围内
if (face.x >= 0 && face.y >= 0 && (face.x + face.width) <= frame.cols && (face.y + face.height) <= frame.rows) {
// 对检测到的人脸进行比对
cv::Mat faceROI = frame(face);
// 调整检测到的人脸区域大小与已知人脸图像相同
cv::resize(faceROI, faceROI, knownFace.size());
double similarity = cv::norm(faceROI, knownFace);
// 比对结果
if (similarity < 1000.0) {
cv::putText(frame, "Match", cv::Point(face.x, face.y - 10), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 0), 2);
}
else {
cv::putText(frame, "Not Match", cv::Point(face.x, face.y - 10), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 255), 2);
}
}
else {
// 处理人脸区域超出图像范围的情况
cout << "人脸区域超出图像范围";
}
}
// 显示帧
cv::imshow("Face Detection", frame);
// 等待按下 ESC 键退出循环
if (cv::waitKey(1) == 27)
break;
}
cv::waitKey();
cv::destroyAllWindows();
return 0;
}
模型文件地址:opencv/data/haarcascades/haarcascade_frontalface_default.xml at master · opencv/opencv · GitHub