OpenCVのcvWaitKey()関数は何をしますか?


82

の実行中に何が起こりcvWaitKey()ますか?いくつかの典型的なユースケースは何ですか?私はOpenCVリファレンスでそれを見ましたが、ドキュメントはその正確な目的について明確ではありません。


3
あなたはそれについて何を理解していませんか、それは何をしていると思いますか?OpenCVのドキュメントの参照が...私には非常に明確なようだ
ダニエルSloof

8
@ user588855質問を確認し、これを含むいくつかの回答を受け入れることが私たち全員にとって重要です。
karlphillip 2011年

4
記録のために、cvWaitKey()は非推奨のC関数になりました。waitKey()最新のC ++と同等です。
StockB 2015年

1
質問が回答済みと見なされるように、回答の1つにマークを付けてください(@SuperElectricは今のところ最善のようです)。答えを待っていると、複数の答えを得るための4年間の時間の長い期間である...
rbaleksandar

たとえば、@ DanielSloofは、戻り値がどの標準に従うかを知っておくと便利です。
lahjaton_j 2015

回答:


138

cvWaitKey(x) / cv::waitKey(x) 2つのことをします:

  1. OpenCVウィンドウ(つまりから作成された)でキーが押されるまでxミリ秒待機しますcv::imshow()。stdinでコンソール入力をリッスンしないことに注意してください。その間にキーが押された場合、キーのASCIIコードが返されます。それ以外の場合は、を返します-1。(xがゼロの場合、キーが押されるのを無期限に待機します。)
  2. でウィンドウを作成しcv::namedWindow()たり、で画像を表示したりするなど、ウィンドウイベントを処理しcv::imshow()ます。

opencvの初心者によくある間違いはcv::imshow()、各描画をcv::waitKey(30)。でフォローアップせずに、ビデオフレームをループで呼び出すことです。この場合、highguiにはからの描画要求を処理する時間が与えられないため、画面には何も表示されませんcv::imshow()


19

簡単に言うと、Xミリ秒の間cvWaitKey()スリープし、キーが押されるのを待ちます。

int cvWaitKey(int X);

キーが押されると、この関数はキーのASCIIコードを返します。または、その間にキーが押されなかった場合は-1を返します。


3
それだけではありません。実際には、キーボード入力を気にしない場合でも、この関数を呼び出すことは、一部のOpenCVアプリケーションにとって不可欠な場合があります。ここにいくつかの詳細情報があります
ドリューノアケス2013年

13

cvWaitKey(0) ボタンを押すまでプログラムを停止します。

cvWaitKey(10)プログラムを停止しませんが、ボタンを押すと、ウェイクアップしてプログラムを終了するように警告します。ループをcvWaitkey停止しないため、ループに使用されます。

通常の使用

char k;

k=cvWaitKey(0);

if(k == 'ESC')

kあなたはキーが押されたかを見ることができます。


5
また、もう少し重要なのは、openCVメッセージループです。ループでcvWaitKey()を呼び出さない限り、cvNamedWindowに新しいデータは表示されません
Martin Beckett

14
-1比較char?= multicharを実行するための私から。これは間違っています。印刷可能な文字(この場合、ESCは印刷不可能な文字であるため不可能ですが、たとえばQキーを使用する場合は?= 'q'比較を実行できます)を使用するか、数値表現の1つを選択します。ASCIIは、16進数(0x1b)、10進数(27)、および8進数(033)の複数の数値システムをサポートします。リストされているものはすべてESCキーを表しています。
rbaleksandar 2015

1
charではなくintである必要があり、ビットopsを使用します
Vlad

@Vladはい、user1564486のように27にする必要があります
FindOutIslamNow

9

。の引数0は次のように解釈されますinfinite

。highGUIウィンドウをドラッグするには、cv::waitKey()関数を継続的に呼び出す必要があります。例:静止画像の場合:

cv::imshow("winname", img);

while(cv::waitKey(1) != 27); // 27 = ascii value of ESC


8

cvWaitKey( )機能に問題があった可能性のある人への注意。それcvWaitKey(x)がまったく待機していないことに気付いた場合は、実際にウィンドウが開いていることを確認してください(つまりcvNamedWindow(...))。関数呼び出しのcvNamedWindow(...)前に宣言を入れてくださいcvWaitKey()


SOへようこそ。あなたと同じように情報を投稿するのに適した場所です。通常、回答を投稿するときは、質問に新しい情報を提供する必要があるため、冗長な投稿は作成されません。あなたの投稿はそうだった。コメントが小さい場合は、後で質問にコメントすることもできます(担当者が増えたとき)。まだ読んでいない場合は、FAQ(stackoverflow.com/faq)を参照することをお勧めします。よろしく
ForceMagic 2012年

5
/* Assuming this is a while loop -> e.g. video stream where img is obtained from say web camera.*/    
cvShowImage("Window",img);

/* A small interval of 10 milliseconds. This may be necessary to display the image correctly */
cvWaitKey(10);  

/* to wait until user feeds keyboard input replace with cvWaitKey(0); */

4

cvWaitKey単に遅延の何かを提供します。例えば:

char c = cvWaitKey(33);
if( c == 27 ) break;

これは、ビデオがopenCVにロードされ、フレームが出力される私のコードの一部でした。33コード内の数字は、の後33msに新しいフレームが表示されることを意味します。したがって、これは33ms、画面に表示されている各フレーム間の遅延または時間間隔でした。お役に立てれば。


1

cvWaitKey(milliseconds) キーボードの次のキーストロークのパラメータとして提供されるミリ秒を待つだけです。

人間の目は1/10秒以内に動くものを見ることができないので、これを使用して同じ画像フレームを画面上にしばらく保持します。キーボードのキーを押すとすぐに次の操作が実行されます。

要するにcvWaitKey(milliseconds)、キーが押されるか、millisecond提供される時間のいずれかを待ちます。


1
「人間の目は1/10秒以内に動くものを見ることができないので、これを使用して同じ画像フレームを画面上にしばらく保持します。キーボードのキーを押すとすぐに次の操作が実行されます」これは本当に問題になりますか?
クォンタム

-1

キーが押されたかどうかを確認するためにミリ秒待機します。その間隔で押された場合はASCII値を返し、それ以外の場合は-1のままです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.