作者本人的开发环境为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就播放完了, 结果你还没看到画面,就已经黑屏了 ....
以上为作者对三个网页内容的总结整理。希望能帮到大家