TVカメラの映像を表示する

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