OpenCV的cvWaitKey()函数有什么作用?

Sim*_*ity 74 c c++ opencv

执行期间会发生什么cvWaitKey()?什么是典型的用例?我在OpenCV参考中看到过,但文档的确切用途并不明确.

Sup*_*ric 131

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().

  • 对于未来的读者:请注意,`cv2.waitKey(x)` 或 `cv::waitKey(x)` 不仅在 *`x = 0`* 时无限等待按键事件,而且在 *`x < 0` 时也无限等待* 即 **`x <= 0`**。资料来源:https://docs.opencv.org/4.x/d7/dfc/group__highgui.html#ga5628525ad33f52eab17feebcfba38bd7 (3认同)

kar*_*lip 18

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

int cvWaitKey(int X);
Run Code Online (Sandbox Code Playgroud)

如果按下某个键,则此函数返回密钥的ASCII代码.如果在此期间没有按下任何键,则返回-1.

  • 这不完全是故事.实际上,即使您不关心键盘输入,调用此函数对于某些OpenCV应用程序也是必不可少的.这里有一些[更多信息](http://opencv.willowgarage.com/wiki/documentation/c/highgui/WaitKey). (3认同)

Jor*_*hez 12

cvWaitKey(0) 停止你的程序直到你按下按钮.

cvWaitKey(10)不会停止你的程序,但是当你按下按钮时醒来并提醒你结束你的程序.它用于循环,因为cvWaitkey不会停止循环.

正常使用

char k;

k=cvWaitKey(0);

if(k == 'ESC')
Run Code Online (Sandbox Code Playgroud)

k你所看到的按下了哪个键.

  • -1来自我做比较**char?= multichar**.这是错的.使用可打印字符(在这种情况下是不可能的,因为ESC是不可打印的字符,但是例如使用Q键可以进行?='q'比较)或选择其中一个数字表示.ASCII支持多个数字系统:十六进制(0x1b),十进制(27)和八进制(033).列出的所有代表ESC键. (10认同)
  • 更重要的是 - 它是openCV消息循环.除非在循环中调用cvWaitKey(),否则不会在cvNamedWindow中看到任何新数据 (5认同)

小智 8

注意任何可能遇到此cvWaitKey( )功能问题的人.如果你发现它cvWaitKey(x)根本没有等待,请确保你实际上有一个窗口打开(即cvNamedWindow(...)).cvNamedWindow(...)在任何cvWaitKey()函数调用之前放置声明.


小智 8

.论证0被解释为infinite

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

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

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


ent*_*eek 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); */
Run Code Online (Sandbox Code Playgroud)


sue*_*ing 5

cvWaitKey只是提供了一些延迟。例如:

char c = cvWaitKey(33);
if( c == 27 ) break;
Run Code Online (Sandbox Code Playgroud)

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