2016-08-22 37 views
2

私はopencvに新しい、おそらく何か理解していないだけのImがあります。 私は手紙aを待っているウェイトキーと、休憩して出口を出す別のものを持っています。 1つ、またはもう1つは正常に動作するようですが、両方はうまく動作しないようです。コンパイラのエラーや警告は出ません。含まれているコードは、列挙された画像のシリーズになりますが、キーボードの文字「q」を押すと閉じることはありません。 私は何が間違っていますか?opencv waitkeyが応答していませんか?

#include <stdio.h> 
#include <opencv2/opencv.hpp> 
#include <iostream> 

using namespace cv; 
using namespace std; 


int main(int argc, char** argv){ 
    VideoCapture cap; 
    // open the default camera, use something different from 0 otherwise; 
    if(!cap.open(0)) 
     return 0; 
    // Create mat with alpha channel 
    Mat mat(480, 640, CV_8UC4);  
    int i = 0; 
    for(;;){ //forever 
      Mat frame; 
      cap >> frame; 
      if(frame.empty()) break; // end of video stream 
      imshow("this is you, smile! :)", frame); 
      if(waitKey(1) == 97){ //a 
      String name = format("img%04d.png", i++); // NEW ! 
      imwrite(name, frame); 
      } 
      if(waitKey(1) == 113) break; // stop capturing by pressing q 
    } 
return 0; 
} 

プログラムを終了するにはどのように 'q'キーを取得できますか? the documentationから

+0

「waitKey(1)== 113」を「waitKey(0)== 113」に変更します。この方法では、1 msだけでなく、キーストロークを待つことになります。 – DimChtz

答えて

1

:無限にキーイベントを待つwaitKey関数(場合遅延< = 0)

又は遅延(ミリ秒)のために、それは正です。

したがって、waitKeyに0(または負の値)を渡すと、キーが押されるまで永遠に待機します。

3

waitKeyを使用して、押されたキーを取得し、対応する操作を行うだけで済みます。

#include <opencv2/opencv.hpp> 
#include <iostream> 

using namespace cv; 
using namespace std; 

int main(int argc, char** argv){ 
    VideoCapture cap; 
    // open the default camera, use something different from 0 otherwise; 
    if (!cap.open(0)) 
     return 0; 
    // Create mat with alpha channel 
    Mat mat(480, 640, CV_8UC4); 
    int i = 0; 
    for (;;){ //forever 
     Mat frame; 
     cap >> frame; 
     if (frame.empty()) break; // end of video stream 
     imshow("this is you, smile! :)", frame); 

     // Get the pressed value 
     int key = (waitKey(0) & 0xFF); 

     if (key == 'a'){ //a 
      String name = format("img%04d.png", i++); // NEW ! 
      imwrite(name, frame); 
     } 
     else if (key == 'q') break; // stop capturing by pressing q 
     else { 
      // Pressed an invalid key... continue with next frame 
     } 
    } 
    return 0; 
} 
+0

このプログラムは効果的に終了しますが、もはやフレームを更新しません。 'a'キーを押すと、更新されますが、前には更新されません。 – j0h

+0

次のフレームに進むには、_a_と_q_以外のいずれかのキーを押します。自動的に次のフレームに移動する場合は、waitKeyに0より大きい値(ミリ秒単位)を設定します。 'int key =(waitKey(1)&0xFF);'を使うことができます。 – Miki

関連する問題