如何使用 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;
}

输出


相关文章