cv::Point getFaceCenter(const cv::Mat& image) {
std::vector<cv::Rect> faces;
cv::Mat gray;
qDebug() << "通道数:" << image.channels();
cv::cvtColor(image, gray, cv::COLOR_RGBA2GRAY);
cv::equalizeHist(gray, gray);
// 检测人脸
face_cascade.detectMultiScale(gray, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
if (faces.empty()) {
return cv::Point(-1, -1);
}
// 只使用第一个检测到的人脸
cv::Rect face = faces[0];
// 在人脸区域检测眼睛
cv::Mat faceROI = gray(face);
std::vector<cv::Rect> eyes;
eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
qDebug() << "眼睛个数:" << eyes.size();
if (eyes.size() < 2) {
return cv::Point(face.x + face.width / 2, face.y + face.height / 2);
}
// 计算眼睛中心
cv::Point eye1(face.x + eyes[0].x + eyes[0].width / 2, face.y + eyes[0].y + eyes[0].height / 2);
cv::Point eye2(face.x + eyes[1].x + eyes[1].width / 2, face.y + eyes[1].y + eyes[1].height / 2);
// 使用红色绘制矩形边框(线宽为2像素)
cv::Mat img1;
image.copyTo(img1);
for (auto eye : eyes) {
cv::rectangle(img1, cv::Rect(eye.x + face.x, eye.y + face.y, eye.width, eye.height), cv::Scalar(0, 0, 255), 2);
}
//cv::rectangle(img1, cv::Rect(eyes[1].x + face.x, eyes[1].y + face.y, eyes[1].width, eyes[1].height), cv::Scalar(0, 0, 255), 2);
cv::rectangle(img1, face, cv::Scalar(0, 255, 0), 2);
cv::imwrite("C:\\Users\\wyqiu\\Pictures\\testPic\\img1.jpg",img1);
// 返回眼睛中心的中点
return cv::Point((eye1.x + eye2.x) / 2, (eye1.y + eye2.y) / 2);
}
haarcascade_lefteye_2splits.xml和haarcascade_righteye_2splits.xml这两个文件有什么用,对上面的函数识别左右眼睛是否有帮助
最新发布