본문 바로가기

버츄얼유튜버

비전 임시) 얼굴, 눈 검출

#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;
using namespace std;

#define CV_HAAR_SCALE_IMAGE 2

String face_cascade = "C:/opencv/sources/data/haarcascades/haarcascade_eye.xml";
String eye_cascade =
"C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";
CascadeClassifier face;
CascadeClassifier eye;

void FaceAndEyeDetect(Mat img) {
    Mat gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);
    vector < Rect > face_pos;
    face.detectMultiScale(gray, face_pos, 1.1, 2, 0 |
        CASCADE_SCALE_IMAGE, Size(10, 10));

    for (int i = 0; i < face_pos.size(); i++) {
        rectangle(img, face_pos[i], Scalar(255, 0, 0), 2);
    }

    /*for (int i = 0; i < face_pos.size(); i++) {
        vector < Rect > eye_pos;
        Mat roi = gray(face_pos[i]);

        eye.detectMultiScale(roi, eye_pos, 1.1, 2, 0
            | CASCADE_SCALE_IMAGE, Size(10, 10));
        
        for (int j = 0; j < eye_pos.size(); j++) {
            Point center(face_pos[i].x + eye_pos[j].x + eye_pos[j].width * 0.5,
                face_pos[i].y + eye_pos[j].y + eye_pos[j].height * 0.5);
            int radius = cvRound((eye_pos[j].width + eye_pos[j].height) * 0.25);
            circle(img, center, radius, Scalar(0, 0, 255), 2.8, 0);
        }
    }*/
    namedWindow("얼굴 검출"); imshow("얼굴 검출", img);
}

int main() {
    Mat f = imread
    //("C:/Users/is7se/source/repos/OpencvStudy/OpencvStudy/img/test_nanami.jpg");
    ("C:/Users/is7se/source/repos/OpencvStudy/OpencvStudy/img/test_nanami2.png");
    assert(f.data);
    bool b1 = face.load(face_cascade);
    bool b2 = eye.load(eye_cascade);
    assert(b1 && b2);
    FaceAndEyeDetect(f);

    waitKey();
    return 0;
}