如何使用 C++ 在 OpenCV 中检测眼睛?
opencvc++server side programmingprogramming更新于 2025/5/14 7:22:17
在这里,我们将学习如何在 OpenCV 中检测眼睛。我们将使用位于 'C:/opencv/sources/data/haarcascades' 中的 haarcascade_eye.xml 分类器来检测眼睛。要检测眼睛,我们需要添加这些标头。
第一个标头是 <iostream>,它是 C++ 编程语言的标头。读写图像和用户界面功能在 'highgui' 标头中定义。我们需要添加 'imgproc' 标头来增强图像质量,我们还使用 'objdetect'标头用于检测面部和眼睛。
以下程序演示如何在 OpenCV 中检测和跟踪眼睛。
示例
#include<iostream> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<opencv2/objdetect/objdetect.hpp> using namespace cv; using namespace std; int main() { Mat frame;//在其中声明一个矩阵到视频帧// namedWindow("Detect");//声明一个窗口来显示我们的工作// VideoCapture image(0);//从默认相机捕获视频// if (!image.isOpened()){ //如果未找到视频源,则显示错误消息// cout << "无法从源加载视频。请确保您的相机正常工作。" << endl; system("pause"); return 0; } double height = image.set(CAP_PROP_FRAME_HEIGHT, 480);//设置每帧的高度// double width = image.set(CAP_PROP_FRAME_WIDTH, 640);//设置每帧的宽度// CascadeClassifier face_cascade, eyes_cascade;//声明一个CascadeClassifier对象// face_cascade.load("C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml");//加载级联分类器// eyes_cascade.load("C:/opencv/sources/data/haarcascades/haarcascade_eye.xml"); while (true) { bool temp = image.read(frame);//将视频帧从源加载到名为 frame 的矩阵中// vector<Rect>faces;//声明一个名为 faces 的向量// face_cascade.detectMultiScale(frame, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(100, 100));//检测人脸 for (int i = 0; i < faces.size(); i++){//用于定位人脸 Point center(faces[i].x + faces[i].width * 0.5, faces[i].y + faces[i].height * 0.5);//获取脸部中心// ellipse(frame, center, Size(faces[i].width * 0.5, faces[i].height * 0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);//在脸上画一个椭圆// Mat faceROI = frame(faces[i]);//将脸部区域作为眼睛的感兴趣区域// vectoreyes;//声明一个名为 eyes 的向量// eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(5, 5));//检测每张脸中的眼睛// for (size_t j = 0; j < eyes.size(); j++){//用于定位眼睛// Point center(faces[i].x + eyes[j].x + eyes[j].width * 0.5, faces[i].y + eyes[j].y + eyes[j].height * 0.5);//获取双眼中心// int radius = cvRound((eyes[j].width + eyes[j].height) * 0.25);//声明眼睛包围圆的半径// circle(frame, center, radius, Scalar(255, 0, 0), 4, 8, 0);//在双眼周围画圆// } } imshow("Detect", frame);//在名为"Detect"的窗口中显示结果// if (waitKey(30) == 27){//每帧等待时间为30毫秒// break; } } return 0; }