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


在這裡,我們將學習如何在 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;//Declaring integer variables to store co-ordinate values//
   int y_axis;//Declaring integer variables to store co-ordinate values//
   Mat frame;//Declaring a matrix to video frame in it//
   namedWindow("Detect");//Declaring a window to show our work//
   VideoCapture image(0);//capturing video from default camera//
   if (!image.isOpened()){ //Error message if video source is not found//
      cout << "Couldn't load video from the source.Make sure your camera is working properly." << endl;
      system("pause");
      return 0;
   }
   double height = image.set(CAP_PROP_FRAME_HEIGHT, 480);//setting up height of each frame//
   double width = image.set(CAP_PROP_FRAME_WIDTH, 640);//setting up width of each frame//
   CascadeClassifier face_cascade, eyes_cascade;//declaring a CascadeClassifier object//
   face_cascade.load("C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml");//loading the cascade classifier//
   eyes_cascade.load("C:/opencv/sources/data/haarcascades/haarcascade_eye.xml");
   while (true) {
      bool temp = image.read(frame);//loading video frames from source to our matrix named frame//
      std::vector<Rect>faces;//Declaring a vector named faces//
      face_cascade.detectMultiScale(frame, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(100, 100));//detecting the face
      for (int i = 0; i < faces.size(); i++){ //for locating the face
         Point center(faces[i].x + faces[i].width * 0.5, faces[i].y + faces[i].height * 0.5);//getting the center of the face//
         ellipse(frame, center, Size(faces[i].width * 0.5, faces[i].height * 0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);//draw an ellipse on the face//
         Mat faceROI = frame(faces[i]);//Taking area of the face as Region of Interest for eyes//
         std::vectoreyes;//declaring a vector named eyes//
         eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(5, 5));//detect eyes in every face//
         for (size_t j = 0; j < eyes.size(); j++){ //for locating eyes//
            Point center(faces[i].x + eyes[j].x + eyes[j].width * 0.5, faces[i].y + eyes[j].y + eyes[j].height * 0.5);//getting the centers of both eyes//
            int radius = cvRound((eyes[j].width + eyes[j].height) * 0.25);//declaring radius of the eye enclosing circles//
            circle(frame, center, radius, Scalar(255, 0, 0), 4, 8, 0);//drawing circle around both eyes//
            x_axis = eyes[j].x;//storing x axis location of eyes in x_axis//
            y_axis = eyes[j].y;//storing y axis location of eyes in y_axis//
            cout << "Position of the eyes is:" << "(" << x_axis << "," << y_axis << ")" << endl;//showing co-ordinate values//
         }
      }
      imshow("Detect", frame);//showing result in window named 'Detect'//
      if (waitKey(30) == 27){ //wait time for each frame is 30 milliseconds//
         break;
      }
   }
   return 0;
}

輸出


更新時間: 2021 年 3 月 10 日

1 千次以上瀏覽

提升您的職業

透過完成課程獲得認證

開始
廣告
© . All rights reserved.