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);
}