TVカメラの映像をそのまま表示する
//
// Webカメラで顔を認識する
//
//
//
#include "cv.h"
#include "highgui.h"
#ifdef _DEBUG //cv21
#pragma comment( lib, "cv210d.lib" )
#pragma comment( lib, "cxcore210d.lib" )
#pragma comment( lib, "cvaux210d.lib" )
#pragma comment( lib, "highgui210d.lib" )
#else
#pragma comment( lib, "cv210.lib" )
#pragma comment( lib, "cxcore210.lib" )
#pragma comment( lib, "cvaux210.lib" )
#pragma comment( lib, "highgui210.lib" )
#endif
int main(int argc, char* argv[])
{
// ビデオキャプチャ構造体
CvCapture *capture = 0;
// フレーム単位データ
IplImage *frame = 0;
// 縦横サイズ
double width = 640;
double height = 480;
int key;
// 顔検出器の読み込み
CvHaarClassifierCascade* cvHCC = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_default.xml");
// 検出に必要なメモリストレージを用意する
CvMemStorage* cvMStr = cvCreateMemStorage(0);
// 検出情報を受け取るためのシーケンスを用意する
CvSeq* face;
// 0番号のカメラに対するキャプチャ構造体を生成する
capture = cvCreateCameraCapture (0);
// キャプチャのサイズを設定する。ただし、この設定はキャプチャを行うカメラに依存するので注意る
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, width);
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, height);
cvNamedWindow ("capture_face_detect", CV_WINDOW_AUTOSIZE);
// 停止キーが押されるまでカメラキャプチャを続ける
while (1) {
frame = cvQueryFrame (capture);
// 画像中から検出対象の情報を取得する
face = cvHaarDetectObjects(frame, cvHCC, cvMStr);
for (int i = 0; i < face->total; i++) {
// 検出情報から顔の位置情報を取得
CvRect* faceRect = (CvRect*)cvGetSeqElem(face, 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);
}
// 顔位置に矩形描画を施した画像を表示
cvShowImage ("capture_face_detect", frame);
// 終了キー入力待ち(タイムアウト付き)
key = cvWaitKey (10);
if (key > 0) {
break;
}
}
cvReleaseMemStorage(&cvMStr); // メモリストレージを解放
cvReleaseCapture (&capture); // カメラキャプチャの解放
cvDestroyWindow("capture_face_detect"); // ウィンドウの破棄
cvReleaseHaarClassifierCascade(&cvHCC); // 顔検出器の解放
return 0;
}