【问题标题】:What does OpenCV's cvWaitKey( ) function do?OpenCV 的 cvWaitKey() 函数有什么作用?
【发布时间】:2011-07-10 04:55:55
【问题描述】:

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

【问题讨论】:

  • 您对此有什么不理解或您认为它有什么作用? OpenCV 文档参考对我来说似乎很清楚......
  • @user588855 对我们所有人来说,重要的是您检查您的问题并接受一些答案,包括这个。
  • 作为记录,cvWaitKey() 现在是一个已弃用的 C 函数。 waitKey() 是现代 C++ 等价物。
  • 能否请您标记其中一个答案(@SuperElectric 的似乎是目前最好的),以便可以认为该问题已回答。 4年等待一个答案并得到多个答案是一段很长的时间......
  • @DanielSloof 例如,很高兴知道返回值遵循哪个标准。

标签: c++ c opencv


【解决方案1】:

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() 的绘图请求。

【讨论】:

    【解决方案2】:

    简单地说,cvWaitKey() 休眠 X 毫秒,等待按下任意键。

    int cvWaitKey(int X);
    

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

    【讨论】:

    • 这还不是全部。实际上,即使您不关心键盘输入,调用此函数对于某些 OpenCV 应用程序也是必不可少的。有一些more information here
    • @DrewNoakes 您共享的链接已损坏。如果可能的话,你能看看并更新它吗?谢谢!
    • 这是通过回程机器的 URL:web.archive.org/web/20120122022754/http://…
    【解决方案3】:

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

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

    正常使用

    char k;
    
    k=cvWaitKey(0);
    
    if(k == 'ESC')
    

    使用k,您可以看到按下了什么键。

    【讨论】:

    • 还有一点更重要的是——它是 openCV 消息循环。除非您在循环中调用 cvWaitKey(),否则您不会在 cvNamedWindow 中看到任何新数据
    • -1 来自我的比较 char ?= multichar。这是错误的。使用可打印字符(在这种情况下这是不可能的,因为 ESC 是不可打印字符,但在使用 Q 键的情况下,您可以进行 ?= 'q' 比较)或选择一个数字表示。 ASCII 支持多种数字系统:十六进制 (0x1b)、十进制 (27) 和八进制 (033)。列出的所有代表 ESC 键。
    • 应该是int而不是char,然后使用bit ops
    • @Vlad 是的,它应该是 27,就像在 user1564486 中一样
    【解决方案4】:

    0 的参数被解释为infinite

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

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

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

    【讨论】:

      【解决方案5】:

      请注意任何可能对cvWaitKey( ) 函数有疑问的人。如果您发现cvWaitKey(x) 根本没有等待,请确保您确实打开了一个窗口(即cvNamedWindow(...))。将 cvNamedWindow(...) 声明放在任何 cvWaitKey() 函数调用之前。

      【讨论】:

      • 欢迎您,这是一个像您一样发布信息的好地方。通常,当您发布答案时,它必须为问题带来新信息,因此不会创建多余的帖子。你的帖子就是这种情况。如果您的评论较少,您也可以稍后评论该问题(当您获得更多代表时)。如果您还没有阅读它,我建议您查看常见问题解答:stackoverflow.com/faq。问候
      【解决方案6】:
      /* 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); */
      

      【讨论】:

        【解决方案7】:

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

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

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

        【讨论】:

          【解决方案8】:

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

          人眼无法在 1/10 秒内看到物体移动,因此我们使用它在屏幕上保持相同的图像帧一段时间。只要按下键盘的键,就会执行下一个操作。

          简而言之,cvWaitKey(milliseconds) 等待按键或millisecond 提供的时间。

          【讨论】:

          • "人眼在不到 1/10 秒内无法看到物体在移动,因此我们使用它在屏幕上保持相同的图像帧一段时间。只要按下键盘的键将执行下一个操作”这对问题真的很重要吗?
          【解决方案9】:

          等待毫秒以检查是否按下了键,如果在该间隔内按下则返回其 ascii 值,否则仍为 -1

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-05
            • 1970-01-01
            • 1970-01-01
            • 2011-12-04
            • 1970-01-01
            • 2018-11-19
            • 2014-05-23
            • 2017-06-19
            相关资源
            最近更新 更多