现在的位置: 首页 > 综合 > 正文

cvWaitKey(k)的简介

2013年09月08日 ⁄ 综合 ⁄ 共 1934字 ⁄ 字号 评论关闭

 

     作者本人的开发环境为VS的MFC构架,结合OpenCV1.0进行图像的处理。可能很多像作者本人一样的初始开发程序员都会用到cvWaitKey(),但是对cvWaitKey()的理解一知半解,在具体开发中会由此产生一些困惑。在查询了一些资料后,将资料整理汇总如下:
    参考的网址如下:
     
http://zhidao.baidu.com/question/113288896
   http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=3324&start=0
   http://www.google.com.hk/search?hl=zh-CN&inlang=zh-CN&newwindow=1&safe=strict&client=aff-cs-360se&hs=kLG&q=%E4%B8%80%E7%A7%92%E5%BA%94%E8%AF%A5%E8%BE%93%E5%87%BA%E5%A4%9A%E5%B0%91%E5%B8%A7%EF%BC%9F&oq=%E4%B8%80%E7%A7%92%E5%BA%94%E8%AF%A5%E8%BE%93%E5%87%BA%E5%A4%9A%E5%B0%91%E5%B8%A7%EF%BC%9F&aq=f&aqi=&aql=&gs_sm=e&gs_upl=67155l89678l0l89948l15l14l0l3l0l2l286l1318l1.4.3l8l0

    首先,在cvWaitKey(k)中,k的单位为毫秒,1000毫秒等于1秒,同时,根据资料的说明,在显示图像的时候,每秒显示27、28帧的时候,我们看到的视频是流畅的。根据作者本人的实验和观察,如果每秒播放25帧视频,看到的视频仍然是流畅的。同时采取25帧的话,k=1000/25=40。即,没处理完一帧后,程序会等待40毫秒才会读取下一帧。在资料中,说明在mfc中cvWaitKey()中的k并无用处,但是,作者本人的程序中,k是正常的。虽然不甚明白原理,但是如果大家遇到同样的问题,可以如此尝试。
    关于cvWaitKey()的介绍,引用OpenCV中文论坛的解释:

    window平台下,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的内部除了sleep休眠之外, 还有重要的Message处理, 比如键盘消息, 字符等....这个消息处理结构对于写过Windows程序的人来说应该是很熟悉的.

    你可以做个极端一点的假设:

    如果没有cvWaitKey的话, 那么循环里面的每个指令执行时间为0.0000000001s,总之趋近于0.那么capture可能有10000帧图像, 那么10000帧图像也之需要0.000001s就播放完了, 结果你还没看到画面,就已经黑屏了 ....

    以上为作者对三个网页内容的总结整理。希望能帮到大家

抱歉!评论已关闭.