2011-03-07 187 views
64

在执行cvWaitKey()期间会发生什么?什么是典型的用例?我在OpenCV参考中看到它,但其文档的确切目的不明确。OpenCV的cvWaitKey()函数是做什么的?

+2

什么别你是否了解它,或者你认为它有什么作用? OpenCV文档参考对我来说似乎非常清楚... – 2011-03-07 08:44:47

+6

@ user588855对于我们所有人来说,重新审视您的问题并接受一些答案(包括这一点)是很重要的。 – karlphillip 2011-03-31 22:38:08

+4

对于记录,'cvWaitKey()'现在是一个弃用的C函数。 'waitKey()'是现代C++的等价物。 – StockB 2015-01-24 19:31:39

回答

10

cvWaitKey(0)停止您的程序,直到您按下按钮。

cvWaitKey(10)不会停止您的程序,但会在您按下按钮时唤醒并提醒您结束程序。它用于循环,因为cvWaitkey不停止循环。

正常使用

char k; 

k=cvWaitKey(0); 

if(k == 'ESC') 

k你可以看到按下了哪个键。

+5

还有一点更重要 - 它是openCV消息循环。除非您在我的循环 – 2011-03-07 15:05:38

+10

-1中调用cvWaitKey()进行比较,否则不会在cvNamedWindow中看到任何新数据** char?= multichar **。这是错误的。使用可打印的字符(在这种情况下是不可能的,因为ESC是不可打印的字符,但在例如使用Q键的情况下,您可以执行?='q'比较)或选择其中一个数字表示。 ASCII支持多种数字系统:十六进制(0x1b),十进制(27)和八进制(033)。所有列出的代表ESC键。 – rbaleksandar 2015-08-14 12:46:35

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); */ 
16

平原简单,被按下cvWaitKey()休眠X毫秒,等待任何键。

int cvWaitKey(int X); 

如果按下某个键,此函数将返回键的ASCII码。如果在此期间没有按键,则返回-1

+3

这并不是完整的故事。实际上,即使你不关心键盘输入,调用这个函数对于一些OpenCV应用程序来说也是必不可少的。这里有一些[更多信息](http://opencv.willowgarage.com/wiki/documentation/c/highgui/WaitKey)。 – 2013-01-27 23:15:59

116

cvWaitKey(x)/cv::waitKey(x)做两两件事:

  1. 它等待X毫秒一个的OpenCV窗口上的键按压(即,从cv::imshow()创建)。请注意,它不会监听控制台输入的标准输入。如果在此期间按下了某个键,它将返回该键的ASCII码。否则,它将返回-1。 (如果X是零,它无限期地等待键按下。)
  2. 它处理任何窗口的事件,诸如与cv::namedWindow()创建窗口,或显示用cv::imshow()图像。

opencv新手常见的错误是通过视频帧在循环中调用cv::imshow(),而不跟随每个绘制与cv::waitKey(30)。在这种情况下,屏幕上不会显示任何内容,因为highgui从来没有时间处理来自cv::imshow()的绘制请求。

+1

1+为一个简单和完整的答案。 – qwerty9967 2013-04-01 15:08:35

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秒内移动,所以我们用它在屏幕上保持一段时间,只要键盘按键被按下,下一个操作就会执行”这个问题真的很重要吗? – quantum 2012-10-20 01:40:40

8

请注意任何可能与cvWaitKey()函数有问题的人。如果您发现cvWaitKey(x)没有在等待,请确保您确实有一个窗口打开(即cvNamedWindow(...))。在进行任何cvWaitKey()函数调用之前,请先声明cvNamedWindow(...)

+0

欢迎来到SO,它是发布信息的好地方,就像你一样。通常,当您发布答案时,它必须为问题带来新信息,因此它不会创建冗余帖子。这是你的文章的情况。如果您的评论较小,您可以稍后对该问题发表评论(当您获得更多的广告时)。如果你还没有阅读它,我建议你看看FAQ:http://stackoverflow.com/faq。问候 – ForceMagic 2012-10-11 06:02:21

6

。参数0被解释为infinite

。为了拖动highGUI窗口,您需要不断调用cv::waitKey()函数。例如,对于静态图像:

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

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

-1

等待毫秒检查键被按下,如果被按压在间隔返回字符的ASCII值,否则它仍然-1