こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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秒後・・・といった形です。

ご回答のほどよろしくお願い致します。

投稿日時 - 2008-11-24 14:53:31

QNo.4503370

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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;
    }
  }
}
といった具合でどうでしょう

投稿日時 - 2008-11-26 21:37:57

お礼

回答ありがとうございます。
また、返事が遅くなってしまい申し訳ありません(>o<)

画像はうまく表示させることができました。
ありがとうございます。
ただ、'c'キーを押しても保存がされなくなりました。

自分でもアレンジしながら頑張りますが、また投稿していただければうれしいです。

投稿日時 - 2008-12-15 10:52:42

ANo.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++;
    }
  }
}
といった具合で …

投稿日時 - 2008-11-24 18:36:23

お礼

回答ありがとうございます。

やってみたのですが、うまく保存できません。

具体的には、cキーを押すとそこから5秒ごとに保存しているように見えるのですが、1回押してから5秒間、カメラ画像が止まってしまい、5秒後に撮影されたと思われる画像に切り替わります。
しかし、どこにも撮影された写真がなく、保存自体うまくできませんでした。

それと、私の説明不足ですが、実行してからcキーを押さずに5秒後、10秒後、15秒後・・・・というようなプログラムを作りたいと考えています。
説明不足で申し訳ありません。

もう1回考えてみるので、もしお時間などありましたらまたの回答よろしくお願いいたします。

投稿日時 - 2008-11-25 15:22:00

あなたにオススメの質問