OpenCV的cvWaitKey()函数做什么?


82

执行过程中会发生什么cvWaitKey()?有哪些典型的用例?我在OpenCV参考中看到了它,但是文档的确切用途尚不清楚。


3
您对此一无所知,或者您认为它做什么?对我来说,OpenCV文档参考似乎很清楚...
Daniel Sloof 2011年

8
@ user588855对我们所有人来说,重要的是您复查问题并接受一些答案,包括这些。
karlphillip 2011年

4
作为记录,cvWaitKey()现在已弃用C函数。waitKey()是现代C ++的等价物。
StockB

1
您能否标记其中一个答案(@SuperElectric似乎是目前最好的答案),以便可以将问题视为已回答。等待答案并获得多个答案的4年时间很长……
rbaleksandar

例如@DanielSloof,很高兴知道返回值遵循哪个标准。
lahjaton_j 2015年

Answers:


138

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

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

对于opencv新手来说,一个常见的错误是cv::imshow()在视频帧中循环调用,而没有在每次抽签后跟进cv::waitKey(30)。在这种情况下,屏幕上什么也不会出现,因为highgui从来没有时间处理来自的绘图请求cv::imshow()


19

简单地说,cvWaitKey()睡眠X毫秒,等待任何按键被按下。

int cvWaitKey(int X);

如果按下某个键,则此函数返回该键的ASCII码。如果在此期间未按任何键,则返回-1


3
这还不是全部。实际上,即使您不关心键盘输入,调用此功能对于某些OpenCV应用程序也是必不可少的。这里有更多信息
Drew Noakes

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'比较)或选择一种数字表示形式。ASCII支持多种数值系统:十六进制(0x1b),十进制(27)和八进制(033)。列出的所有内容均代表ESC键。
rbaleksandar

1
应该是int而不是char,然后使用位操作
Vlad18年

@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;

Tis是我的代码中的一部分,其中将视频加载到openCV中并输出帧。33代码中的数字表示在之后33ms,将显示一个新帧。因此,33ms屏幕上显示的是每帧之间的间隔或时间间隔。希望这可以帮助。


1

cvWaitKey(milliseconds) 只需等待毫秒作为下一个键盘击键的参数提供。

人眼无法在不到1/10秒的时间内看到事物的运动,因此我们可以使用它在屏幕上保持相同的图像帧一段时间。按下键盘琴键后,将立即执行下一个操作。

总之,请cvWaitKey(milliseconds)等待按键或millisecond提供的时间。


1
“人眼在不到1/10秒的时间内看不到物体在移动,因此我们将其用于在屏幕上保留相同的图像帧一段时间。一旦按下键盘键,将执行下一个操作”这个问题真的很重要吗?
2012年

-1

等待毫秒检查按键是否被按下,如果在此间隔中按下,则返回其ascii值,否则仍为-1

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.