|||
昨晚做课后第四章第一题,对cvwaitkey()这个函数认识不深,吃了大亏了。不知道它和cvshowimage()是一对天生的好基友。循环里面没有加上cvwaitkey(),还原下当时的程序。
using namespace std;
int main()
{
CvCapture* video=cvCreateFileCapture("d:\test.avi");
IplImage* frame;
IplImage* img2=cvCreateImage(cvSize((int)cvGetCaptureProperty(video,CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty(video,CV_CAP_PROP_FRAME_HEIGHT)),
IPL_DEPTH_8U,
1);
IplImage* img3=cvCreateImage(cvSize((int)cvGetCaptureProperty(video,CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty(video,CV_CAP_PROP_FRAME_HEIGHT)),
IPL_DEPTH_8U,
1);
cvNamedWindow("img1");
cvNamedWindow("img2");
cvNamedWindow("img3");
while(1)
{
frame=cvQueryFrame(video);
if(!frame)
{
cout<<"Something wrong with frame!";
break;
}
cvConvertImage(frame,img2,CV_RGB2GRAY);
cvCanny(img2,img3,10,50,3);
cvShowImage("img1",frame);
cvShowImage("img2",img2);
cvShowImage("img3",img3);
//if(27==cvWaitKey(330))
//break;
}
cvReleaseCapture(&video);
cvDestroyAllWindows();
return 0;
}
单步循环赋值什么都正常,就是不出来图片,无奈上网搜了下别人的程序对比了下,发现循环里少了这个东西,加上调试图片正常出现。以下是网上转载的别人对cvwaitkey和cvshowimage的解释。
用opencv来显示图像或视频时,如果后面不加cvWaitKey这个函数,基本上是显示不出来的。
1.显示图像,一般要在cvShowImage()函数后加一句cvWaitKey(0);否则图像无法正常显示。
2.显示视频,一般要在cvShowImage()函数后加一句cvWaitKey(2);【这里的2是2ms的意思,具体数字根据视频帧率来定】否则视频无法正常播放。
cvWaitKey(int delay)说明:
此函数试图让程序等待delay ms后在继续运行其后面的语句。
若delay=0,则无限期等待,直到按下键盘任意按键。
此函数的返回值是按下的键的值。
此函数仅对opencv产生的窗口有效(cvNamedWindow)
以下代码可以得到某个按键的值。
------------------------------
c = cvWaitKey(10);
printf("%c,%d",c,c);------------------------------
解释:
1.显示图像时,一般要用cvWaitKey();或者cvWaitKey(0);此时程序显示出图像后将暂停,等待接收一个键盘输入;有点类似调c程序时在最后加的getch();若没有这句话,则显示图像的代码很快就执行过去了,所以要用cvWaitKey()来暂停。
2.显示视频时,一般用cvWaitKey(delay) delay是延时的ms数。表示显示一帧,然后等delay ms ,再显示下一帧。如果没有cvWaitKey函数,则视频所有的帧会很快速的显示一遍(非常快,以至于人眼无法看清........)
还有这里也有讨论:http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=3324&p=11520
下面附上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);
}
}
}
接触opencv的新手接触到这部分可以注意一下。初次碰到这个问题还蛮郁闷的-,-
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2025-1-10 02:03
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社