http://junkroom2cyberrobotics.blogspot.jp/2012/10/raspberry-pi-opencv_16.html
/ OpenCV カメラ画像顔検出のテスト。
// gcc -Wall -o "%e" "%f" -g -L/usr/local/lib
// -lopencv_core -lopencv_imgproc -lopencv_highgui
// -lopencv_ml -lopencv_video -lopencv_features2d
// -lopencv_calib3d -lopencv_objdetect -lopencv_contrib
// -lopencv_legacy -lopencv_flann -lusb
// 実行フォルダに haarcascade_frontalface_default.xml を置く。
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
int main(int argc, char **argv)
{
CvCapture *capture = 0;
IplImage *frame = 0, *src_gray = 0;
int max_detect, min_detect;
int c ,i;
double width = 320, height = 240;
//double width = 640, height = 480;
// 正面顔検出のための検出器を読み込む。
CvHaarClassifierCascade *cvHCC =
(CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_default.xml", 0, 0, 0);
// 検出用のメモリストレージの用意。
CvMemStorage *cvMStr = cvCreateMemStorage(0);
// 検出情報格納用シーケンスの用意。
CvSeq *detectFace;
// 検出最小及び最大サイズ設定。
max_detect = (int)height;
min_detect = (int)(height / 5);
// カメラに対するキャプチャ構造体を作成。
if (argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
capture = cvCreateCameraCapture(argc == 2 ? argv[1][0] - '0' : 0);
// キャプチャサイズの設定。
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height);
// ウィンドウ作成。
cvNamedWindow("face_detect", CV_WINDOW_AUTOSIZE);
while(1)
{
// 画像キャプチャ。
frame = cvQueryFrame(capture);
// グレイスケールイメージに変換。
src_gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
// 顔検出処理。
detectFace = cvHaarDetectObjects(frame, // 対象イメージ。
cvHCC, // Haar分類器カスケード。
cvMStr, // メモリストレージ。
1.1, // スケーリングファクタ。
3, // 近接矩形グループ化。
CV_HAAR_DO_CANNY_PRUNING, // 処理モード。
cvSize(min_detect, min_detect), // 最小窓サイズ。
cvSize(max_detect, max_detect)); // 最大窓サイズ。
// 検出結果を矩形&クロス表示。
for (i = 0; i < detectFace->total; i++)
{
CvRect *faceRect = (CvRect*)cvGetSeqElem(detectFace, i);
cvRectangle(frame,
cvPoint(faceRect->x, faceRect->y),
cvPoint(faceRect->x + faceRect->width, faceRect->y + faceRect->height),
CV_RGB(255, 0, 0),
3,
CV_AA,
0);
cvLine(frame,
cvPoint(faceRect->x + (int)(faceRect->width / 2) -10,
faceRect->y + (int)(faceRect->height / 2)),
cvPoint(faceRect->x + (int)(faceRect->width /2) + 10,
faceRect->y + (int)(faceRect->height /2)),
CV_RGB(255, 0, 0),
3,
CV_AA,
0);
cvLine(frame,
cvPoint(faceRect->x + (int)(faceRect->width / 2) ,
faceRect->y + (int)(faceRect->height / 2) - 10),
cvPoint(faceRect->x + (int)(faceRect->width /2),
faceRect->y + (int)(faceRect->height /2) + 10),
CV_RGB(255, 0, 0),
3,
CV_AA,
0);
}
cvShowImage("face_detect", frame);
c = cvWaitKey(10);
if(c != -1) break;
//sleep(2);
}
// 後片付け。
cvReleaseMemStorage(&cvMStr);
cvReleaseHaarClassifierCascade(&cvHCC);
cvReleaseCapture(&capture);
cvDestroyWindow("face_detect");
return 0;
}