Computer >> Máy Tính >  >> Lập trình >> C ++

Làm thế nào để theo dõi mắt trong OpenCV bằng C ++?

Ở đây, chúng ta sẽ học cách theo dõi mắt trong OpenCV. Sau khi thám thính cặp mắt, việc theo dõi là một nhiệm vụ dễ dàng và đơn giản. Chúng tôi đã sử dụng vòng tròn để bao quanh những con mắt được phát hiện. Theo dõi tâm của vòng tròn có nghĩa là theo dõi tâm của mắt. Để theo dõi tâm của vòng tròn, chúng ta cần hai biến số nguyên. Điều này đã được thực hiện ở hai dòng đầu tiên (thứ 9 và thứ 10 dòng) bên trong hàm main (). Tên của các biến số nguyên là 'x_axis' và 'y_axis'.

Trong dòng 42 và 43, các giá trị tọa độ ngang và dọc của tâm đã được sao chép vào biến 'x_axis' và 'y_axis' và những giá trị này có tâm của hình tròn. Vào ngày thứ 44 dòng, sử dụng câu lệnh 'cout', chúng tôi đã hiển thị giá trị của tâm. Đây là cách chúng tôi có thể theo dõi vị trí của mắt.

Đoạn mã sau để theo dõi vị trí mắt trong OpenCV bằng C ++.

Ví dụ

#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;
}

Đầu ra

Làm thế nào để theo dõi mắt trong OpenCV bằng C ++?


Làm thế nào để theo dõi mắt trong OpenCV bằng C ++?