博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cvWaitKey源码的理解(OpenCV函数)
阅读量:4298 次
发布时间:2019-05-27

本文共 1803 字,大约阅读时间需要 6 分钟。

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 )//
当等待的时间小于等于0时
            GetMessage(&message, 0, 0, 0);  //无限的等待消息。(
阻塞式函数
        else if( PeekMessage(&message, 0, 0, 0, PM_REMOVE) == FALSE ) // 如果没有查询到消息. (非阻塞式函数)
        {
            Sleep(1); //让渡出线程的时间片,防止CPU居高不下; 等待时间可能很长,不可能让CPU一直处理本函数。该用法很有用。
            continue; //继续f
无限or循环
        }
//处理多个opencv窗口的消息
        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); //窗口处理
WM_DESTROY,和字符按键消息
                    return (int)message.wParam;
                case WM_SYSKEYDOWN: //处理系统按键消息,如Alt,  F1,....F12..
                    if( message.wParam == VK_F10 ) 
                    {
                        is_processed = 1;
                        return (int)(message.wParam << 16);
                    }
                    break;
                case WM_KEYDOWN:
                    TranslateMessage(&message);
                    if( (message.wParam >= VK_F1 && message.wParam <= VK_F24) ||
                        message.wParam == VK_HOME || message.wParam == VK_END ||
                        message.wParam == VK_UP || message.wParam == VK_DOWN ||
                        message.wParam == VK_LEFT || message.wParam == VK_RIGHT ||
                        message.wParam == VK_INSERT || message.wParam == VK_DELETE ||
                        message.wParam == VK_PRIOR || message.wParam == VK_NEXT )
                    {
                        DispatchMessage(&message);
                        is_processed = 1;
                        return (int)(message.wParam << 16);
                    }
                default:
                    DispatchMessage(&message); //分发消息给窗口程序
                    is_processed = 1;
                    break;
                }
            }
        }
//将仍未处理过的消息,派发
        if( !is_processed )
        {
            TranslateMessage(&message);
            DispatchMessage(&message);
        }
    }
}
延伸一个等待1秒后,开始执行的另一端代码的范例。
DWORD dwStart = :: GetTickCount();
while(::GetTickCount() - dwStart < 1000)
{
    Sleep(1);
}
 

转载地址:http://xanws.baihongyu.com/

你可能感兴趣的文章
OpenCV 中boundingRect、minAreaRect的用法区别
查看>>
libfacedetection 余老师的人脸检测
查看>>
车牌识别
查看>>
车牌识别 LPR-----字符分割
查看>>
EasyPR--开发详解(7)字符分割
查看>>
EasyPR--开发详解(2)车牌定位
查看>>
目标检测——opencv cascade训练的一般使用流程与常见问题
查看>>
开运算—闭运算
查看>>
opecv训练数字 0, 2(简单分类)
查看>>
图片修改 + 文字修改
查看>>
字符是识别结果
查看>>
字符是识别结果2
查看>>
字符是识别---4----直方图+图片数据信息+增加二值化处理后
查看>>
字符是识别---5----只利用直方图信息
查看>>
A图片识别错误分析,阈值影响
查看>>
字符是识别---6---只利用直方图信息--训练样本+二值化
查看>>
字符是识别---7---直方图信息+源数据20*20--训练样本+二值化
查看>>
字符是识别---8--直方图信息+源数据20*20--训练样本+二值化
查看>>
字符是识别---9--直方图信息+源数据20*20--训练样本0~9+二值化 单纯的0~9字符识别还可以
查看>>
字符是识别---10--源数据20*20--训练样本0~A----基于TensorFlow+CNN实现
查看>>