hellodrx1的个人博客分享 http://blog.sciencenet.cn/u/hellodrx1

博文

【opencv】1.学习opencv课后习题chapter4遇到的问题

已有 4643 次阅读 2013-7-17 17:34 |个人分类:opencv学习|系统分类:科研笔记| cvwaitkey()

昨晚做课后第四章第一题,对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的新手接触到这部分可以注意一下。初次碰到这个问题还蛮郁闷的-,-



https://blog.sciencenet.cn/blog-972981-708967.html


下一篇:【opencv】cout显示Mat类对象会跳出exceptional的解决方法
收藏 IP: 202.103.47.*| 热度|

0

评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-7-5 14:20

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部