관리 메뉴

ComputerVision Jack

[컴퓨터 비전 - Face Detect] 본문

Campus Project/Homework

[컴퓨터 비전 - Face Detect]

JackYoon 2020. 1. 20. 18:44
반응형

동영상 파일을 읽어 FaceDetect 하는 프로그램

Face영역을 사각형 바운딩 박스로 검출하고 얼굴 위에 모자와 안경을 씌운다.

안경 src
모자 src

케스케이드 분류기

동영상에서 frame을 읽어와 cascade 분류기를 사용하여 얼굴과 눈을 검출한다.

[Main 함수]

int main() {
    VideoCapture cap("../_res/example.avi");
    if (!cap.isOpened()) {
        cerr << "Video open failed!" << endl;
        return 1;
    }
    double fps = cap.get(CAP_PROP_FPS);
    int delay = cvRound(100 / fps);
    Mat frame;

    while (true) {
        cap >> frame;
        if (frame.empty())
            break;
        detect_face(frame);
        if (waitKey(delay) == 27)
            break;

    }
    waitKey();
    return 0;
}

#VideoCapture클래스로 동영상을 읽어와 작업한다.

첫 if문은 동영상을 검출하여 동영상이 잘 읽혀왔는지 파악한다.

cap객체를 frame에 넣고 frame에서 detect_face함수를 적용하여 결과를 출력한다.

 

[detect_face함수]

void detect_face(Mat src) {
    CascadeClassifier classifier("../_model/haarcascade_frontalface_default.xml");
    CascadeClassifier eye_classifier("../_model/haarcascade_eye.xml");
    vector faces;
    classifier.detectMultiScale(src, faces);

    Mat image = imread("../_res/src.png");
    Mat image_gray = imread("../_res/src.png", IMREAD_GRAYSCALE);

    Mat imageg = imread("../_res/glass.jpg");
    Mat imageg_gray = imread("../_res/glass.jpg", IMREAD_GRAYSCALE);
    for (Rect rc : faces) {
        Mat imageRoi(src, Rect(rc.width-60 , rc.height-260, image.cols, image.rows));
        Mat mask(120 - image_gray);
        rectangle(src, rc, Scalar(255, 255, 0), 2); // face detect
        image.copyTo(imageRoi, mask); // 모자 mask;

        Mat faceRoi = src(rc);
        vector eyes;
       eye_classifier.detectMultiScale(faceRoi, eyes);

        for (Rect eye : eyes) { 
            Mat gimageRoi(src, Rect(eye.width + 310, eye.height + 350, imageg.cols, imageg.rows));
            Mat mask(120 - imageg_gray);
            imageg.copyTo(gimageRoi, mask);
            Point center(eye.x + eye.width / 2, eye.y + eye.height / 2);
            circle(faceRoi, center, eye.width / 2, Scalar(255, 0, 0), 2, LINE_AA);
        }  
    }
    imshow("src", src);
}

#CascadeClassifier 클래스를 사용하여 미리 학습된 분류기를 가져온다.

눈 검출 또한 CascdeClassifier을 사용하여 미리 학습된 분류기를 사용한다.

 

Mat객체를 이용하여 src파일을 읽어 온다.

faces에는 검출된 영역의 bouding Rect정보를 갖고 있다. for문을 사용하여 Roi영역에 대한 값을 정의하고

mask연산을 사용하여 영상에 모자를 입힌다.

 

이번엔 정의된 face영역 내에서 눈을 찾고, 찾은 눈 영역에 대해서 안경에 대해 마스크 연산을 진행한다.

face detect

모자가 잘 장착된 것을 확인 할 수 있다. 안경은 영상이 좋지 않아 눈 검출에 오류가 있어서 다중으로

안경이 입혀져 구현 부분에서 배제하였다.

반응형

'Campus Project > Homework' 카테고리의 다른 글

[머신러닝 - 2차원 2클래스 분류]  (0) 2020.01.21
[게임 - snake game]  (2) 2020.01.21
[이미지 - Perspective Transform]  (0) 2020.01.19
[이미지 - 필터링 적용]  (1) 2020.01.17
[이미지 - 동전 검출]  (1) 2020.01.16
Comments