当前位置:C++技术网 > 资讯 > opencv编程:8 imshow不显示图像和waitkey函数

opencv编程:8 imshow不显示图像和waitkey函数

更新时间:2016-03-30 19:30:26浏览次数:1+次

   想用opencv对图像做一些操作,先实现简单的读取和显示,但是利用下面的代码,只是显示了窗口没有显示图像,

Mat image=imread("T1.jpg");
namedWindow("image");
imshow("image",image);
system(“pause”);
return 0;

  运行结果是只显示了如下的窗口,没有在窗口中显示图片,当把鼠标放到窗口上时,一直是等待的状态,

   检查了opencv 的配置,没有什么问题,设断点查看,图像确实读取成功了,imwrite函数将图像写出也是成功的。对比了以前的一个成功的程序,发现两者之间的差别是之前成功的程序在imshow函数之后有waitkey()函数,而这个程序在imshow函数之后是system函数。琢磨了好一会,又在网上搜了搜,把程序改了一下,成功了….

程序改为:
Mat image=imread("T1.jpg");
namedWindow("image");
imshow("image",image);
waitkey(0);
return 0;

   思考了一下:使用vs时候,运行程序时会出现控制台一闪而过的情况,system(“pause”)的功能是防止控制台一闪而过,一直以为waitkey函数也是这个功能,所以不能一开始就发现imshow不能显示图像的原因。现在终于知道它的功能不是防止控制台一闪而过,那么waitkey的功能是什么呢。

   在opencv手册上,对于waitkey函数是这样介绍的,

C++:int waitkey(int delay=0);

The function waitkey waits for a key event infinitely(when delay≤0)or for delay milliseconds, when it is positive. It returns the code of the pressed key or -1 if no key was pressed before the specified time had elapsed.
   大致意思是,waitkey的功能是等待一个按键操作,当waitkey函数的参数小于等于0的时候,会一直等待一个键盘按键操作,然后程序才能继续运行,当参数大于零时,程序会等待相应的毫秒继续运行。并且当waitkey的参数小于等于0时,返回的是所按的键对应的码值,当参数大于0时,返回的是-1。

   看到这里,或许会觉得waitkey函数的功能就是等待一个按键操作,然后程序才会继续运行。可是,随意在一段程序中加入waitkey()函数,无论参数是多少,程序都不会停在waitkey函数的位置,不会等待一个按键操作,也不会等待相应的毫秒,就像下面的这段程序,

int main(){
    cout<<”Test function waitkey”<<endl;
    waitkey(10000000);
    if(waitkey(0)==’f’){
          cout<<”success”<<endl;
           return 0;
         }
     else
      {
          cout<<”false”<<endl;
           return -1
       }
}

   控制台仍然是一闪而过,为什么会这样呢,既没有等待按键操作也没有稍作停留。Opencv手册中对waitkey函数的描述下面有这样一个note

The function is the only method in HighGUI that can fetch and handle events, so it needs to be called periodically for normal event processing unless HighGUI is used within an environment that takes care of event processing.

  这个意思是说,waitkey函数的使用,必须有一个HighGUI交互界面,这就是为什么在一般的程序中waitkey函数不起任何作用。程序中有像imshow()namewindow()等这种函数,waitkey才会发挥作用,imshow()namewindow()之后没有waitkey函数话,图像不会显示出来。