アプリ版:「スタンプのみでお礼する」機能のリリースについて

投降させていただきます。

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

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

A 回答 (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;
    }
  }
}
といった具合でどうでしょう
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2008/12/15 10:52

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++;
    }
  }
}
といった具合で …
    • good
    • 0
この回答へのお礼

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

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

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

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

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

お礼日時:2008/11/25 15:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!