OpenCV函数cvWaitKey(k)简介

来源:互联网 发布:淘宝商城百度 编辑:程序博客网 时间:2024/05/27 03:25

作者本人的开发环境为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的源码:

 

[cpp] view plaincopy
  1. <span style="font-size:13px;">CV_IMPL int  
  2. cvWaitKey( int delay )  
  3. {  
  4.     int time0 = GetTickCount();  
  5.   
  6.     for(;;)  
  7.     {  
  8.         CvWindow* window;  
  9.         MSG message;  
  10.         int is_processed = 0;  
  11.   
  12.         if( (delay > 0 && abs((int)(GetTickCount() - time0)) >= delay) || hg_windows == 0 )  
  13.             return -1;  
  14.   
  15.         if( delay <= 0 )  
  16.             GetMessage(&message, 0, 0, 0);  
  17.         else if( PeekMessage(&message, 0, 0, 0, PM_REMOVE) == FALSE )  
  18.         {  
  19.             Sleep(1);  
  20.             continue;  
  21.         }  
  22.   
  23.         for( window = hg_windows; window != 0 && is_processed == 0; window = window->next )  
  24.         {  
  25.             if( window->hwnd == message.hwnd || window->frame == message.hwnd )  
  26.             {  
  27.                 is_processed = 1;  
  28.                 switch(message.message)  
  29.                 {  
  30.                 case WM_DESTROY:  
  31.                 case WM_CHAR:  
  32.                     DispatchMessage(&message);  
  33.                     return (int)message.wParam;  
  34.   
  35.                 case WM_KEYDOWN:  
  36.                     TranslateMessage(&message);  
  37.                 default:  
  38.                     DispatchMessage(&message);  
  39.                     is_processed = 1;  
  40.                     break;  
  41.                 }  
  42.             }  
  43.         }  
  44.   
  45.         if( !is_processed )  
  46.         {  
  47.             TranslateMessage(&message);  
  48.             DispatchMessage(&message);  
  49.         }  
  50.     }  
  51. }  
  52. </span>  


    可见cvWaitKey的内部除了sleep休眠之外, 还有重要的Message处理, 比如键盘消息, 字符等....这个消息处理结构对于写过Windows程序的人来说应该是很熟悉的.

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

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

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


本文转自 http://blog.csdn.net/yeqiu712/article/details/6974150

原创粉丝点击