タグ別アーカイブ: OpenCV

OpenCvの顔認識で遊びました

タグ: | 投稿日: 投稿者:

OpenCVで顔認識を行って適当なところに目線も入れてみました。
モデルは弊社映像スタッフでございます。

結果として誤認識も結構ありますが、お手軽に作った割にはなかなかです。

これが動画

こちらが静止画

blogSample

ソースコード的にはこんな感じです。モルフォロジーしたりエッジを求めたら
精度が上がるかな?と思ったけれど見当違いでした。

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>

main(int argc, char* argv[]) {
        char    haacFile[1024];
        memset(haacFile, 0x00, sizeof(haacFile));
        strcpy(haacFile, "haarcascade_frontalface_alt.xml");
        if(argc < 3){                 printf("Enter input video, and Output video file name.\n");                 return 2;         } else if(argc > 3){
                memset(haacFile, 0x00, sizeof(haacFile));
                strcpy(haacFile, argv[3]);
        }
        CvHaarClassifierCascade *cvHCC = (CvHaarClassifierCascade*)cvLoad(haacFile);
        if(cvHCC == NULL) return 1;
        CvMemStorage* cvMStr = cvCreateMemStorage(0);
//      cvNamedWindow("Example2_10", CV_WINDOW_AUTOSIZE);
        cvNamedWindow("FaceDetect", CV_WINDOW_AUTOSIZE);
        CvCapture *capture = cvCreateFileCapture(argv[1]);
        if(!capture){
                return -1;
        }
        IplImage *bgr_frame;
        double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
        printf("fps=%d\n", (int)fps);

        CvSize size = cvSize((int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),
                        (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT));

        printf("frame (w, h) = (%d, %d)\n", size.width, size.height);

        CvVideoWriter *writer = cvCreateVideoWriter(argv[2], CV_FOURCC('D', 'X', '5', '0'), fps, size);

//      IplImage *canny_frame = cvCreateImage(size, IPL_DEPTH_8U, 1);
//      IplImage *temp = cvCreateImage(size, IPL_DEPTH_8U, 1);

        IplImage *gray_frame = cvCreateImage(size, IPL_DEPTH_8U, 1);
        while((bgr_frame = cvQueryFrame(capture)) != NULL){
                cvCvtColor(bgr_frame, gray_frame, CV_BGR2GRAY);
//              cvMorphologyEx(gray_frame, canny_frame, temp, NULL, CV_MOP_CLOSE, 1);
//              cvCanny(gray_frame, canny_frame, 60, 128, 3);
                CvSeq *face = cvHaarDetectObjects(gray_frame, cvHCC, cvMStr);
//              cvShowImage("Example2_10", bgr_frame);
                for (int i=0;i < face->total;i++){
                        CvRect *faceRect = (CvRect*)cvGetSeqElem(face, i);
                        cvRectangle(bgr_frame,
                                        cvPoint(faceRect->x, faceRect->y + ((faceRect->height / 10) * 2)),
                                        cvPoint(faceRect->x + faceRect->width, faceRect->y + ((faceRect->height / 10) * 6)),
                                        CV_RGB(0, 0 ,0), CV_FILLED, CV_AA);
                }
                cvShowImage("FaceDetect", bgr_frame);

                cvWriteToAVI(writer, bgr_frame);
                char c = cvWaitKey(10);
                if(c == 27) break;
        }
        cvReleaseVideoWriter(&writer);
        cvReleaseImage(&gray_frame);
//      cvReleaseImage(&canny_frame);
        cvReleaseCapture(&capture);
}