2010/04/09

カメラからのキャプチャ

前回は画像を表示したので、今度は動画を表示したいと思います。
また、サイズの変更とグレースケール化も一緒に行います。

出来上がりは以下のような感じになります。


以下、ソースコードになります。

/*
* カメラからキャプチャしたデータを半分のサイズにし、

* グレースケールに変換したものを出力する。
*/

#include "cv.h"
#include "highgui.h"

int main(int argc, char** argv)
{
//表示用のウィンドウを作成する 
cvNamedWindow("OriginalWindow",CV_WINDOW_AUTOSIZE); //カメラで取得したデータの表示用
cvNamedWindow("SmallSizeWindow",CV_WINDOW_AUTOSIZE); //半分のサイズでグレイスケールのデータの表示用

//カメラから取り込む
//cvCreateCameraCaptureに0を指定すると、最初に見つかるカメラデバイスが選ばれます。
CvCapture *capture = cvCreateCameraCapture(0);

//カメラが無い時用
//CvCapture *capture = cvCrateFileCapture(動画ファイル名);


printf("Please press ESC key to exit.");

//カメラのサイズを取り込みます。 cvGetCapturePropertyの戻り値はdoubuleなので、intにキャスト
CvSize size=cvSize
(
(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH ),
(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT )
);

//縦横を半分に
CvSize halfsize=cvSize((int)size.width/2,(int)size.height/2);


//カメラから取得したデータ用
IplImage * CapturedFrame;

//半分のサイズのデータを格納する
//カラーのままなので、チャネル数は3
IplImage * SmallFrame=cvCreateImage(halfsize,IPL_DEPTH_8U,3);
//グレースケール用
//グレースケールなので、チャネル数は1
IplImage * GrayFrame=cvCreateImage(halfsize,IPL_DEPTH_8U,1);


while(1)
{
//1フレームキャプチャ
CapturedFrame=cvQueryFrame(capture);
if(!CapturedFrame) break;

//小さいサイズに変更
cvResize(CapturedFrame,SmallFrame);

//小さくしたものをグレースケールに変更
//cvCvtColorを使用する際は、変換元と変換先のサイズが同じである必要があります。
cvCvtColor(SmallFrame,GrayFrame,CV_RGB2GRAY);

//ウィンドウに表示
cvShowImage("OriginalWindow",CapturedFrame);
cvShowImage("SmallSizeWindow",GrayFrame);

//33ミリ秒 キーの入力を待つ(escキーが押されるとループを抜ける)
//33ミリ秒ごとにキャプチャするので、表示は30FPS程度になります
char c=cvWaitKey(33);
if(c==27) break;

}

//リソースを開放
cvReleaseCapture(&capture);
cvReleaseImage(&GrayFrame);
cvReleaseImage(&SmallFrame); 

cvDestroyWindow("OriginalWindow");
cvDestroyWindow("OriginalWindow");

}

0 件のコメント:

コメントを投稿