(学习笔记一)——CvWaitKey函数机制解析

原创 2012年03月24日 15:55:06

首先,CvWaitKey函数源码如下:

CV_IMPL int
cvWaitKey( int delay )
{
    int time0 = GetTickCount();

    for(;;)
    {
        CvWindow* window;
        MSG message;
        int is_processed = 0;

        if( (delay > 0 && abs((int)(GetTickCount() - time0)) >= delay) || hg_windows == 0 )
            return -1;

        if( delay <= 0 )
            GetMessage(&message, 0, 0, 0);
        else if( PeekMessage(&message, 0, 0, 0, PM_REMOVE) == FALSE )
        {
            Sleep(1);
            continue;
        }

        for( window = hg_windows; window != 0 && is_processed == 0; window = window->next )
        {
            if( window->hwnd == message.hwnd || window->frame == message.hwnd )
            {
                is_processed = 1;
                switch(message.message)
                {
                case WM_DESTROY:
                case WM_CHAR:
                    DispatchMessage(&message);
                    return (int)message.wParam;

                case WM_KEYDOWN:
                    TranslateMessage(&message);
                default:
                    DispatchMessage(&message);
                    is_processed = 1;
                    break;
                }
            }
        }

        if( !is_processed )
        {
            TranslateMessage(&message);
            DispatchMessage(&message);
        }
    }
}
当CvWaitKey函数参数为0时,当执行到CvWaitKey(0)时,CvWaitKey内部进入循环,并处理CvNamedWindow函数产生窗口接收到的消息,如果是按键字符消息则退出CvWaitKey函数,并返回字符的ASCII码,否则将一直循环。
如果CvWaitKey函数的参数为数值,则等待响应的毫秒数,并处理CvNamedWindow创建窗口接收到的消息,响应过程同上,如果在等待时间结束,即使没有字符消息也退出CvWaitKey函数。
在上述代码中可以看出,其实CvWaitKey函数内部也能够处理其他窗口(非CvNamedWindow产生的窗口)接收到的消息,消息驱动机制类似于MFC本身的消息机制,并且调用MFC的消息响应函数执行。因此,可以通过将CvNamedWindow创建窗口与MFC自身窗口分别置于活动状态,就可以切换CvWaitKey去执行CvNamedWindow窗口接收消息或者是MFC窗口接收消息。
但CvWaitKey函数只有在有CvNamedWindow产生的窗口时,才能响应,否则相当于不执行(其实还是执行的,只不过是进入函数立即就退出了)。如果将CvNamedWindow窗口隐藏,就可以保证CvWaitKey只执行MFC窗口接收到的消息,这就可以使在有while(1)循环显示图像或视频的函数中不产生堵死,这也是一种在不使用多线程的情况下利用MFC以及OPENCV显示视频的方法。

此解释内容参考了帖子:http://blog.csdn.net/chenyusiyuan/article/details/4744097中新增功能后的代码,以及OPENCV中文论坛中的响应帖子http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=3324&sid=38e3f2d8fc86fabfe63f420d0b425159#p11433



cvWaitKey使用

cvWaitKey(int delay) cvWaitKey()函数的功能是是程序暂停,等待用户触发一个按键操作。但如果该函数参数设为一个正数,则程序将暂停一段时间,时间长为该整数值个毫秒单位,然后...
  • yang090510118
  • yang090510118
  • 2014年10月14日 16:37
  • 1184

opencv中waitkey(0)不起作用

楼主在运行一个链接了opencv库的程序时,发现了一个奇怪的现象,就是我的在程序中调用的等待函数waitKey()不起作用,不管是是使用waitKey(100),waitKey(0),waitKey(...
  • autocyz
  • autocyz
  • 2015年07月18日 11:32
  • 5798

opencv中的cvWaitKey

用opencv来显示图像或视频时,如果后面不加cvWaitKey这个函数,基本上是显示不出来的。 1.显示图像,一般要在cvShowImage()函数后加一句cvWaitKey(0);否则图像无法正...
  • karon1988
  • karon1988
  • 2011年09月01日 08:59
  • 6964

cvWaitKey(k)的简介

作者本人的开发环境为VS的MFC构架,结合OpenCV1.0进行图像的处理。可能很多像作者本人一样的初始开发程序员都会用到cvWaitKey(),但是对cvWaitKey()的理解一知半解,在具体开发...
  • yeqiu712
  • yeqiu712
  • 2011年11月15日 18:44
  • 14403

Opencv中的cvWaitkey函数的用法

openv中对cvWaitkey函数的定义如下: int cvWaitKey( int delay=0 ) 返回值为int型,函数的参数为int型,当delay小于等于0的时候,如果没有键盘触发,...
  • gxiaob
  • gxiaob
  • 2013年06月07日 22:57
  • 38235

关于键盘输入cvWaitKey(0)没有反应

为什么你输入半天会没有反应,并不显示你输入的字符 那是因为,你的窗口焦点得在window上 可以用鼠标在window上点击下,后再输入字符。 char key;  key=cvWaitKey(...
  • wuxiaoyao12
  • wuxiaoyao12
  • 2012年04月18日 18:16
  • 3408

waitKey() 函数的作用

OpenCV中的一个函数 函数原型为: C++: int waitKey(int delay=0) Python: cv2.waitKey([delay]) ...
  • Micheal_w
  • Micheal_w
  • 2014年11月19日 09:22
  • 9651

cvWaitKey

http://apps.hi.baidu.com/share/detail/34961575 其实我至今还没有搞清楚这个函数的具体功能是什么,有人说就是等待按键,和Sleep(10) g...
  • zm_nong
  • zm_nong
  • 2012年04月28日 11:03
  • 1215

openCV中waitKey函数介绍

#include #include iostream > #include Windows.h > using namespace cv; using namespace s...
  • lxw907304340
  • lxw907304340
  • 2016年03月24日 14:05
  • 5818

OpenCV中的CV_IMPL是什么意思?

本文作者是OpenCV代码网,网址http://opencv66.net/ 在cvEqualizeHist的函数定义源码中发现了宏定义CV_IMPL,如下: CV_IMPL void cvEq...
  • wenhao_ir
  • wenhao_ir
  • 2016年04月21日 12:18
  • 1317
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(学习笔记一)——CvWaitKey函数机制解析
举报原因:
原因补充:

(最多只允许输入30个字)