OpenCVで顔認識を行って適当なところに目線も入れてみました。
モデルは弊社映像スタッフでございます。
結果として誤認識も結構ありますが、お手軽に作った割にはなかなかです。
これが動画
こちらが静止画
ソースコード的にはこんな感じです。モルフォロジーしたりエッジを求めたら
精度が上がるかな?と思ったけれど見当違いでした。
#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); }