Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++를 사용하여 OpenCV에서 눈을 감지하는 방법은 무엇입니까?

<시간/>

여기서는 OpenCV에서 눈을 감지하는 방법을 배웁니다. 눈을 감지하기 위해 'C:/opencv/sources/data/haarcascades'에 있는 haarcascade_eye.xml 분류기를 사용합니다. 눈을 감지하려면 이 헤더를 추가해야 합니다.

첫 번째 헤더는 이며 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;//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//
      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//
         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//
         }
      }
      imshow("Detect", frame);//showing result in window named 'Detect'//
      if (waitKey(30) == 27){ //wait time for each frame is 30 milliseconds//
         break;
      }
   }
   return 0;
}

출력

C++를 사용하여 OpenCV에서 눈을 감지하는 방법은 무엇입니까?