如何使用 C++ 在 OpenCV 中追踪眼睛?

opencvc++server side programmingprogramming

本文将学习如何在 OpenCV 中追踪眼睛。检测到眼睛后,追踪将变得轻松简单。我们使用圆圈圈出检测到的眼睛。追踪圆心意味着追踪眼睛的中心。为了追踪圆心,我们需要两个整型变量。这已在 main() 函数的前两行(第 9 行和第 10 行)中完成。这两个整型变量的名称分别为"x_axis"和"y_axis"。

在第 42 行和第 43 行中,中心的水平和垂直坐标值被复制到"x_axis"和"y_axis"变量中,这两个变量代表圆心。在第 44 行,我们使用"cout"语句显示了中心点的值。这就是我们追踪眼睛位置的方法。

以下代码使用 C++ 在 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() {
   int x_axis;//声明用于存储坐标值的整数变量//
   int y_axis;//声明用于存储坐标值的整数变量//
   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 的矩阵//
      std::vectorfaces;//声明一个名为 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]);//将脸部区域作为眼睛的感兴趣区域//
         std::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);//在双眼周围绘制一个圆//
            x_axis = eyes[j].x;//将眼睛的 x 轴位置存储在 x 轴上//
            y_axis = eyes[j].y;//将眼睛的 y 轴位置存储在 y 轴上//
            cout << "眼睛的位置是:" << "(<<< x_axis << ",<<< y_axis << ")<<< endl;//显示坐标值//
         }
      }
      imshow(&"Detect , frame);//在名为"Detect"的窗口中显示结果//
      if (waitKey(30) == 27){//每帧等待时间为30毫秒//
         break;
      }
   }
   return 0;
}

输出


相关文章