• 締切済み

OpenCVの静止画保存のセルフタイマー

投降させていただきます。 VC++2008、windowsXPでOpenCVを使ってプログラムを作っています。 OpenCVのサンプルを使ってカメラを起動し、静止画をボタンを押すことで保存することはできるようになりました。 これをアレンジして、静止画をセルフタイマーで自動に保存するようなプログラムを作りたいと考えています。 //画像表示と保存 while ( 1 ) { // カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); // 画像を表示する cvShowImage( windowNameCapture, frameImage ); // 'q'キーが入力されたらループを抜ける key = cvWaitKey( 1 ); if ( key == 'q' ) { break; } // 'c'キーが入力されったら画像を保存する else if(key=='c'){ sprintf(filename,"C:/Documents and Settings/ryoji/My Documents/My Pictures/frame%d.bmp",count); cvSaveImage(filename,frameImage); count++;   } } これでqキーを押せばループを抜け、cキーが押されたら保存できます。 このcキーを押すことで保存されるのを、5秒毎に保存するようなプログラムをつくりたいです。 5秒後、10秒後、15秒後・・・といった形です。 ご回答のほどよろしくお願い致します。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

すみません 少々勘違いをしていたようです cvWaitKey(5000); では 画像更新のループが止まってしまいますね ・・・ int bSelf = 0; int nCnt = 0; while ( 1 ) {   // カメラからの入力画像1フレームをframeImageに格納する   frameImage = cvQueryFrame( capture );   // 画像を表示する   cvShowImage( windowNameCapture, frameImage );   // 'q'キーが入力されたらループを抜ける   key = cvWaitKey( 1 );   if ( key == 'q' ) {     break;   }   // 'c'キーが入力されったら画像を保存する   else if(key=='c'){     // フラグ更新     bSelf = ( bSelf == 0 );     nCnt = 0;   }   if ( bSelf && key == 0 ) {     nCnt++;     if ( nCnt >= 5000 ) {           sprintf(filename,"C:/Documents and Settings/ryoji/My Documents/My Pictures/frame%d.bmp",count);       cvSaveImage(filename,frameImage);       count++;       // 次回のためにカウンタを初期化       nCnt = 0;     }   } } といった具合でどうでしょう

k-ryoji
質問者

お礼

回答ありがとうございます。 また、返事が遅くなってしまい申し訳ありません(>o<) 画像はうまく表示させることができました。 ありがとうございます。 ただ、'c'キーを押しても保存がされなくなりました。 自分でもアレンジしながら頑張りますが、また投稿していただければうれしいです。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Windowsであれば Timerを使ってといった手法が一般的なように思います OpenCVだけでやるなら cvWaitKeyに5000 とか与えて5秒の待ちを行い cvSaveImageなどで保存をするといった具合でしょう int bSelf = 0; while ( 1 ) {   // カメラからの入力画像1フレームをframeImageに格納する   frameImage = cvQueryFrame( capture );   // 画像を表示する   cvShowImage( windowNameCapture, frameImage );   // 'q'キーが入力されたらループを抜ける   key = cvWaitKey( 1 );   if ( key == 'q' ) {     break;   }   // 'c'キーが入力されったら画像を保存する   else if(key=='c'){     // フラグ更新     bSelf = ( bSelf == 0 );   }   if ( bSelf ) {     if ( cvWaitKey( 5000 ) == 0 ) {           sprintf(filename,"C:/Documents and Settings/ryoji/My Documents/My Pictures/frame%d.bmp",count);       cvSaveImage(filename,frameImage);       count++;     }   } } といった具合で …

k-ryoji
質問者

お礼

回答ありがとうございます。 やってみたのですが、うまく保存できません。 具体的には、cキーを押すとそこから5秒ごとに保存しているように見えるのですが、1回押してから5秒間、カメラ画像が止まってしまい、5秒後に撮影されたと思われる画像に切り替わります。 しかし、どこにも撮影された写真がなく、保存自体うまくできませんでした。 それと、私の説明不足ですが、実行してからcキーを押さずに5秒後、10秒後、15秒後・・・・というようなプログラムを作りたいと考えています。 説明不足で申し訳ありません。 もう1回考えてみるので、もしお時間などありましたらまたの回答よろしくお願いいたします。

関連するQ&A

  • OpenCVを用いて任意の時間で静止画を保存したい。

    OpenCVを用いて"s"キーを押したら静止画保存が始まり、再度"s"キーを押したら保存が終了しるプログラムを作成しています。(保存レートは1秒間で30フレームの静止画保存で考えています)また、保存する静止画を指定したフォルダに保存するプログラムを作成していますが、プログラム作成の経験が浅く、なかなかうまく作れず困っております。どのようにプログラムを組めばこのようなプログラムが作れるのでしょうか。下記のプログラムは作成でき、これを基礎にして作り上げていこうと考えています。プログラムの内容としては"c"キーを押した分だけ、連番でbip形式で画像を保存するプログラムです。精度の関係上timegettime関数を使用したいと考えているのですが、、。 <ソースプログラム> #include <stdio.h> #include <highgui.h> int main( int argc, char** argv ){ int key; // キー入力用変数 int counter = 0; CvCapture *capture; // キャプチャ用構造体 IplImage *frameImage; // キャプチャ画像用IplImage char str[32]; char windowNameCapture[] = "CMOS Camera Image"; // ウィンドウネーム // カメラの初期化 if( ( capture = cvCreateCameraCapture(-1)) == NULL ){ // カメラデバイスが検出できない場合 printf("カメラデバイスを検出できません\n"); return -1; } // ウィンドウ生成 cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE ); // メインループ while(1){ // カメラからの1フレームをframeImageに格納 frameImage = cvQueryFrame( capture ); // 画像表示 cvShowImage( windowNameCapture, frameImage ); // 'ESC'キーが入力されたらループを抜ける key = cvWaitKey(1); if( key == '\x1b' ){ break; // 静止画保存 } else if( key == 'c'){ sprintf_s(str, "cmosview%04d.bmp",counter++); cvSaveImage(str, frameImage ); } } // キャプチャ解放 cvReleaseCapture( &capture ); // ウィンドウ破棄 cvDestroyWindow( windowNameCapture ); return 0; }

  • OpenCVでの静止画像の保存

    書き込みさせていただきます。 今、OpenCVのサンプルにあるfacedetectをいじっているのですが、赤い円もしっかりと顔を認識することができました。 その中に静止画像の保存をするプログラムを入れたいのですが、実行をすると赤い円はしっかりと表示されるのですが、保存すると消えてしまいます。理由がまったくわからないので教えていただければ幸いです。 if( capture ) { for(;;) {      //カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); if( !cvGrabFrame( capture )) break; frame = cvRetrieveFrame( capture ); if( !frame ) break; if( !frame_copy ) frame_copy = cvCreateImage( cvSize(frame->width,frame->height), IPL_DEPTH_8U, frame->nChannels ); if( frame->origin == IPL_ORIGIN_TL ) cvCopy( frame, frame_copy, 0 ); else cvFlip( frame, frame_copy, 0 );    //画像を輝度画像に変換,縮小,ヒストグラムを平坦化 detect_and_draw( frame_copy ); // 画像を表示する cvShowImage( windowNameCapture, frameImage ); //cvShowImage( windowNameFace, faceImage ); //キー入力が行われるまで表示を続ける key = cvWaitKey( 2 ); //'c'キーが入力されったら画像を保存する if ( key == 'c' ){ sprintf(filename,"C:/Documents and Settings/ryoji/My Documents/My Pictures/CV-P/fame%d.bmp", count);  cvSaveImage(filename,frameImage);  count++; } // 'q'キーが入力されたらループを抜ける else if ( key == 'q' ){ break; } } cvReleaseImage( &frame_copy ); cvReleaseCapture( &capture ); } facedetectのファイルの中にcが押されたら保存、qが押されたら終了にしています。保存、終了ともにできていますが、赤い丸だけ消えます。 よろしくお願いします。

  • OpenCVによる連続静止画保存

    OpenCVとVisual Studio 2005を使ってカメラ画像を出力し、キーを押すことで画像をファイルに保存しています。しかし、キーを押すたびに画像が上書きされてしまい、結局保存ファイルは一つだけになってしまい連続して画像ファイルが取得できません。下記のプログラムで下のほうに書いてあるcvSaveImage()関数にうまくカウンタを使ってやればいいと思うのですが、私の技量ではできませんでした。知っている方がいたら教えてください。よろしくお願いします。 //--------------------------------------------------------- // 概要 : カメラからの入力画像をそのまま表示 // File Name : image.c // Library : OpenCV for MS-Windows 1.0 //--------------------------------------------------------- #include <stdio.h> #include <highgui.h> int main( int argc, char** argv ){ int key; // キー入力用の変数 CvCapture *capture; // カメラキャプチャ用の構造体 IplImage *frameImage; // キャプチャ画像用IplImage char windowNameCapture[] = "Capture"; // キャプチャした画像を表示するウィンドウの名前 // カメラを初期化する if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) { // カメラが見つからなかった場合 printf( "カメラが見つかりません\n" ); return -1; } // ウィンドウを生成する cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE ); // メインループ while ( 1 ) { // カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); // 画像を表示する cvShowImage( windowNameCapture, frameImage ); // 'q'キーが入力されたらループを抜ける key = cvWaitKey( 1 ); if ( key == 'q' ) { break; }else if( key == 'c'){ cvSaveImage("picture.bmp", frameImage ); } } // キャプチャを解放する cvReleaseCapture( &capture ); // ウィンドウを破棄する cvDestroyWindow( windowNameCapture ); return 0; }

  • OpenCVで画像保存を随時保存していくには

    OpenCVで画像保存を随時保存していくには 現在OpenCVでボタンを押すごとに画像を随時保存していくプログラムを作っているのですが、わからなくなってしまった次第です。 ↓は一部抜粋 int count = 0; (略) } else if (key == 'a' ){ //'a'キーが押されたらresult画像を保存 sprintf(filename,"image/result%d.jpg",count); cvSaveimage(filename,resultImage); //cvSaveImage("image/result%d.jpg", resultImage); count++; } という感じに作りました。 自分のイメージとしては、imageフォルダにresult0からaを押すごとにresult1・result2と保存していく用にしたと思ったのですが、実際にはresult.jpgしか保存されず、それに上書きしかされません。 どうすればいいか、教えていただけると幸いです。

  • OpenCV webカメラ同時出力について

    opencvで画像処理をしています。 Webカメラを2台同時に出力させるプログラムをつくりたいと思っているのですが、方法が全く分かりません。 どうすれば2台同時に出力させることができますか? 1台だけ出力させるプログラムはこちらを使っています。 #include <stdio.h> #include <highgui.h> int main( int argc, char** argv ){ int key; // キー入力用の変数 CvCapture *capture; // カメラキャプチャ用の構造体 IplImage *frameImage; // キャプチャ画像用IplImage char windowNameCapture[] = "Capture"; // キャプチャした画像を表示するウィンドウの名前 // カメラを初期化する if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) { // カメラが見つからなかった場合 printf( "カメラが見つかりません\n" ); return -1; } // ウィンドウを生成する cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE ); // メインループ while ( 1 ) { // カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); // 画像を表示する cvShowImage( windowNameCapture, frameImage ); // 'q'キーが入力されたらループを抜ける key = cvWaitKey( 1 ); if ( key == 'q' ) { break; } } // キャプチャを解放する cvReleaseCapture( &capture ); // ウィンドウを破棄する cvDestroyWindow( windowNameCapture ); return 0; }

  • OpenCV プログラムについて

    webカメラを表示するプログラムをつくりました。 しかし、webカメラのウィンドウが小さいのでフルウィンドウにして表示させたいです。 どうすればフルウィンドウでwebカメラを表示することができますか? 解答よろしくお願いします #include <stdio.h> #include <highgui.h> int main( int argc, char** argv ){ int key; // キー入力用の変数 CvCapture *capture; // カメラキャプチャ用の構造体 IplImage *frameImage; // キャプチャ画像用IplImage char windowNameCapture[] = "Capture"; // キャプチャした画像を表示するウィンドウの名前 // カメラを初期化する if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) { // カメラが見つからなかった場合 printf( "カメラが見つかりません\n" ); return -1; } // ウィンドウを生成する cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE ); // メインループ while ( 1 ) { // カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); // 画像を表示する cvShowImage( windowNameCapture, frameImage ); // 'q'キーが入力されたらループを抜ける key = cvWaitKey( 1 ); if ( key == 'q' ) { break; } } // キャプチャを解放する cvReleaseCapture( &capture ); // ウィンドウを破棄する cvDestroyWindow( windowNameCapture ); return 0; }

  • opencv

    opencvライブラリを用いて、C++の言語を使っています。 現在S'キーを押すと、1秒ごとに背景を更新していくプログラムを作ろうとしています。 しかし、このプログラムを作ることができません。 よろしければ、プログラムを教えてください。 お願いします。

  • Aviで静止画を何枚か連ねたい

    Aviで時間差で静止画を何枚か連ねたいです。 たとえば、各静止画の表示時間を5秒として 画像Aが5秒表示され、続けて画像Bが5秒表示され、続けて・・・としたいのです タイムライン上で 00:00:00:00~00:00:05:00で画像A 00:00:05:00~00:00:10:00で画像B (タイムライン画面を添付しました) とやったらできると思ったのですが 出力した動画ファイルをみてみましたら、最初の画像Aだけが数秒でて、終わりになってしまいました。 やりたいことは、イメージ的には紙芝居みたいに数秒づつ次々と静止画が現れる というものです。 どうしたらいいのでしょうか

  • 動画の静止画の保存について。

    バァッファローのBDドライブを購入して、編集ソフトが付いていました。 動画の静止画を作成出来るのですが、ソフトから外に画像を出せません。 「Power Direcor」 というソフトです。 ソフト内以外に静止画を保存する方法はありますか。 ーーーーーーーーーー 他、、 他に動画の静止画を作れるソフトありますか。 BDとDVDの静止画を作りたいのですが。 簡単なソフトだとありがたいです。 宜しくお願いします。

  • OpenCVによる時間差表示

    書き込みさせていただきます。 今OpenCVをインストールしてVC++にてプログラミングをしています。 カメラ画像を取得してそこに点を打とうとしています。 //中心 cvCircle(frameImage,cvPoint(320,250),1,CV_RGB(0,255,0),5,8,0); //右隅 cvCircle(frameImage,cvPoint(635,250),1,CV_RGB(0,255,0),5,8,0); //左隅 cvCircle(frameImage,cvPoint(5,250),1,CV_RGB(0,255,0),5,8,0); //上 cvCircle(frameImage,cvPoint(320,470),1,CV_RGB(0,255,0),5,8,0); //下 cvCircle(frameImage,cvPoint(320,5),1,CV_RGB(0,255,0),5,8,0); のようにして無理やり点を作って表示させることができました。 この点を 中心→0秒から5秒まで表示 右隅→5秒から10秒まで表示 左隅→10秒から15秒まで表示 のように時間をずらして表示するようなプログラムを作りたいのですが、やり方が調べてもよくわかりません。 教えていただければ幸いです。 よろしくお願いいたします。

専門家に質問してみよう