1.opencv人眼检测概述:
OpenCV 中有多种方法可以用来进行人眼检测,其中常用的有以下几种:
Haar 特征分类器:使用训练好的 Haar 特征分类器来检测人眼。
LBP 特征分类器:使用 LBP 特征分类器来检测人眼。
HOG + SVM:使用 HOG 特征和 SVM 分类器来检测人眼。
CNN 网络:使用卷积神经网络来训练检测模型。
人脸检测+人脸关键点检测: 先使用人脸检测模型检测人脸,在使用人脸关键点检测模型检测人眼。
这里展示的是使用lbpcascade_frontalface.xml与 haarcascade_eye_tree_eyeglasses.xml配合进行人眼检测。
2.详细c++代码
这里先检测摄像头中面积最大的人脸,再在最大人脸中用级联分类器检测人眼,代码如下:
#include <opencv2/objdetect.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
// 加载人脸和眼睛分类器
CascadeClassifier faceCascade("lbpcascade_frontalface.xml");
CascadeClassifier eyeCascade("haarcascade_eye_tree_eyeglasses.xml");
// 打开摄像头
VideoCapture capture(0);
if (!capture.isOpened()) {
//cout << "摄像头打开失败" << endl;
return -1;
}
// 循环读取每一帧
while (true) {
Mat frame;
capture >> frame;
if (frame.empty()) {
//cout << "没有捕获到图像" << endl;
break;
}
// 将图像转化为灰度图像
Mat gray;
cvtColor(frame, gray, COLOR_BGR2GRAY);
equalizeHist(gray, gray);
// 检测人脸
vector<Rect> faces;
faceCascade.detectMultiScale(gray, faces, 1.1, 2, CASCADE_SCALE_IMAGE, Size(90, 90));
//找出最大的人脸
Rect faceRect;
int maxArea = 0;
for(auto &r:faces) {
int area = r.width * r.height;
if (area > maxArea) {
maxArea = area;
faceRect = r;
}
}
// 检测眼睛
Mat faceROI = gray(faceRect);
vector<Rect> eyes;
eyeCascade.detectMultiScale(faceROI, eyes, 1.1, 22, CASCADE_SCALE_IMAGE, Size(15, 15));//CASCADE_SCALE_IMAGE
// 画出人脸和眼睛的矩形框
for (size_t i = 0; i < eyes.size(); i++) {
Point center(faceRect.x + eyes[i].x + eyes[i].width / 2, faceRect.y + eyes[i].y + eyes[i].height / 2);
int radius = cvRound((eyes[i].width + eyes[i].height) * 0.25);
circle(frame, center, radius, Scalar(0, 0, 255), 2);
}
imshow("Frame", frame);
if (waitKey(1) == 27) // 按ESC键退
{
break;
}
}
}
3.检测函数详解
eyeCascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30))是OpenCV中用来检测人脸上眼睛位置的函数。
参数含义如下:
faceROI: 检测的图像,需要是灰度图
eyes: 检测到的眼睛的位置,返回为一个vector
1.1: 缩放因子,用于控制级联分类器在图像上进行搜索时的缩放级别,值越大,检测出的结果就越粗略,但检测速度会更快;值越小,检测出的结果就越精确,但检测速度会更慢。
2: 参数设置检测到的目标需要被多少个检测器识别,值越高,检测的阈值越高,反之越低。haarcascade_eye_tree_eyeglasses.xml文件中包含了25个分类器。
0 | CASCADE_SCALE_IMAGE: 检测方式,0表示普通检测,CASCADE_SCALE_IMAGE表示按比例检测
Size(30, 30): 眼睛最小尺寸
该函数会在faceROI中检测眼睛,并将检测到的眼睛位置保存到eyes中。
4.检测效果图
该模型的缺点是,当闭眼时,眼部区域检出率弱。