また、サイズの変更とグレースケール化も一緒に行います。
出来上がりは以下のような感じになります。
以下、ソースコードになります。
/* * カメラからキャプチャしたデータを半分のサイズにし、 * グレースケールに変換したものを出力する。 */ #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 件のコメント:
コメントを投稿