ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [OpenCV] Webcam을 이용해서 얼굴을 인식하는 간단한 예제
    Tech/Development 2013. 9. 13. 22:03

    이전에 OpenCV를 이용해서 간단히 webcam에 접근하는 예제를 포스팅 한 적이 있는데, 기왕 웹캠을 띄웠으니 얼굴 인식도 추가해보기로 했다. 추가적으로 구현하는 것이 아니라 OpenCV에서 제공하는 함수를 가져다 쓰기만 하면 된다.

    /*
    *   @file ocv_cam_face.cc
    *   @brief Face detection using OpenCV with Webcam
    *   @author http://thinkpiece.tistory.com
    */
    
    #include "opencv/cv.h"
    #include "opencv/highgui.h"
    #include <iostream>
    
    int main(int argc, char *argv[])
    {
    
        // -------------------------------------------------------------------------
        // webcam routine
        cv::VideoCapture capture(0);
    
        if( !capture.isOpened() ) {
            std::cerr << "Could not open camera" << std::endl;
            return 0;
        }
    
        // create a window
        cv::namedWindow("webcam",1);
    
        // -------------------------------------------------------------------------
        // face detection configuration
        cv::CascadeClassifier face_classifier;
        face_classifier.load("haarcascade_frontalface_default.xml");
    
        while (true) {
            bool frame_valid = true;
    
            cv::Mat frame_original;
            cv::Mat frame;
    
            try {
                capture >> frame_original; // get a new frame from webcam
                cv::resize(frame_original,frame,cv::Size(frame_original.cols/2,
                    frame_original.rows/2),0,0,CV_INTER_NN); // downsample 1/2x
            } catch(cv::Exception& e) {
                std::cerr << "Exception occurred. Ignoring frame... " << e.err
                          << std::endl;
                frame_valid = false;
            }
    
            if (frame_valid) {
                try {
                    // convert captured frame to gray scale & equalize
                    cv::Mat grayframe;
                    cv::cvtColor(frame, grayframe, CV_BGR2GRAY);
                    cv::equalizeHist(grayframe,grayframe);
    
                    // -------------------------------------------------------------
                    // face detection routine
    
                    // a vector array to store the face found
                    std::vector<cv::Rect> faces;
    
                    face_classifier.detectMultiScale(grayframe, faces, 
                        1.1, // increase search scale by 10% each pass
                        3,   // merge groups of three detections
                        CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE,
                        cv::Size(30,30));
    
                    // -------------------------------------------------------------
                    // draw the results
                    for(int i=0; i<faces.size(); i++) {
                        cv::Point lb(faces[i].x + faces[i].width, 
                                     faces[i].y + faces[i].height);
                        cv::Point tr(faces[i].x, faces[i].y);
    
                        cv::rectangle(frame, lb, tr, cv::Scalar(0,255,0), 3, 4, 0); 
                    }
    
                    // print the output
                    cv::imshow("webcam", frame);
    
                } catch(cv::Exception& e) {
                    std::cerr << "Exception occurred. Ignoring frame... " << e.err
                              << std::endl;
                }
            }
            if (cv::waitKey(30) >= 0) break;
        }
    
        // VideoCapture automatically deallocate camera object
        return 0;
    }
    

    OpenCV에서는 얼굴 인식을 위한 여러가지 템플릿을 이미 제공하고 있다. OpenCV가 설치된 폴더를 살펴보면 haarcascade classifier를 위한 여러가지 xml파일들을 찾을 수 있을 것이다. 사용자가 직접 얼굴 데이터베이스를 기반으로 학습해놓지 않아도 얼추 잘 된다. 위 예제는 그 파일들 중 haarcascade_frontalface_default.xml을 사용한 예제. 이외에도 alt, alt2, tree 등 몇가지 수식어가 붙은 버전들이 함께 제공된다. 아래는 수행결과.


    댓글

Copyright 2022 JY