opencv中waitkey(0)不起作用

楼主在运行一个链接了opencv库的程序时,发现了一个奇怪的现象,就是我的在程序中调用的等待函数waitKey()不起作用,不管是是使用waitKey(100),waitKey(0),waitKey(-1),或者是使用if(waitKey(0) == ‘q’),waitKey总是不起作用。

举个简单的例子:

int main()
{
    cout<<"I am so cool "<<endl;
    waitKey(0);
    return 0;
}

结果程序运行的时候会发现控制台窗口一闪而过。

当时笔者很迷惑,按道理我得随便按一个按键之后,窗口才会消失啊。

后来笔者想可能是我不小心碰到了,于是就改写了程序:

int main()
{
    cout<<"I am so cool "<<endl;
    if(waitKey(0) == ‘q‘)
        return 0;
    else
        return -1;
}

结果还是这样,控制台窗口一闪而过。

这时笔者就觉得应该是waitKey这个函数有些问题了,于是查阅了opencv的参考手册(PS:真心觉得opencv的官方参考手册很有用,尤其是这个文件opencv2refman.pdf),我搜索到waitKey这个函数,发现这个函数说明的最后,有这么一个note:

The function only works if there is at least one HighGUI window created and the window is active. If there are several HighGUI windows, any of them can be active.

此时我才恍然大悟,原来waitKey的使用,必须是在程序中至少有一个HighGUI交互界面,比如,我们最常用的imshow()等这种函数。而我程序中只有一个控制台命令窗口,这个是不属于HighGUI交互界面的,所以此时waitKey是失效的。

在第二个程序中,因为waitKey(0)根本就没有生效,所以也不会一直等待按键’q’的到来,当然窗口也是会一闪而过。

但是,如果我的程序中没有HighGUI交互界面,但是我如果只有控制台窗口,而且我也想让他停在当前界面,不会一闪而过,该如何?

笔者给出两个简单方法:

  1. 在return前加上system(“pause”)。这条语句的意思是让程序暂停执行,直到你按了任意键,才会继续执行后面的程序。
  2. 在程序中给出一个等待输入的语句,比如char response; std::cin>>response这样控制台就会一直等待你的输入

至此,问题成功解决。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 23:09:34

opencv中waitkey(0)不起作用的相关文章

【OpenCV】opencv3.0中的SVM训练 mnist 手写字体识别

前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的ml包含了很多的ML框架接口,就试试了. 详细的OpenCV文档:http://docs.opencv.org/3.0-beta/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html mnist数据下载:http://yann.l

C++中减去‘0’的作用( -&#39;0&#39; )

我们在日常研(chao)究(xi)大佬们的代码时,可能会遇到减去字符'0'的情况,比如下图,这种语法问题吧说简单它不那么简单,毕竟不好理解:但说难吧也不难,其实就是让代码更简洁更有逼格的途径而已. 说了那么多屁话那么这个减去零到底是干啥的呢? 它的作用就是减去0的ASCII值:48.可以方便的用来转换大小写或者数字和和字符.比如我们可以写这么一个函数: #include <cstdio> #include <iostream> using namespace std; int ch

sql语句中where 1=1和 0=1 的作用

sql where 1=1和 0=1 的作用 where 1=1; 这个条件始终为True,在不定数量查询条件情况下,1=1可以很方便的规范语句. 一.不用where  1=1  在多条件查询中的困扰 举个例子,如果您做查询页面,并且,可查询的选项有多个,同时,还让用户自行选择并输入查询关键词,那么,按平时的查询语句的动态构造,代码大体如下: string MySqlStr="select * from table where": if(Age.Text.Lenght>0) {

sql语句中 where 1=1和 0=1 的作用

where 1=1和 0=1 的作用 where 1=1; 这个条件始终为True,在不定数量查询条件情况下,1=1可以很方便的规范语句. 一.不用where  1=1  在多条件查询中的困扰 举个例子,如果您做查询页面,并且,可查询的选项有多个,同时,还让用户自行选择并输入查询关键词,那么,按平时的查询语句的动态构造,代码大体如下: string MySqlStr="select * from table where": if(Age.Text.Lenght>0) { MySq

OpenCV中图像算术操作与逻辑操作

OpenCV中图像算术操作与逻辑操作 在图像处理中有两类最重要的基础操作分别是图像点操作与块操作,简单点说图像点操作就是图像每个像素点的相关逻辑与几何运算.块操作最常见就是基于卷积算子的各种操作.实现各种不同的功能.今天小编就跟大家一起学习OpenCV中图像点操作相关的函数与应用场景.常见算术运算包括加.减.乘.除,逻辑运算包括与.或.非.异或.准备工作: 选择两张大小一致的图像如下.加载成功以后显示如下: 加法操作结果如下: 减法操作结果如下: 乘法操作结果如下: 除法操作结果如下: 权重加法

目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)

在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行opencv中给的sample并稍加修改. Camshift函数的原型为:RotatedRect CamShift(InputArray probImage, Rect& window, TermCriteria criteria). 其中probImage为输入图像直方图的反向投影图,window为要

OpenCV中通过滑动条阈值分割多通道图像

1.阈值分割 阈值分割法是一种基于区域的图像分割技术.其基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类.根据图像阈值化算法所依据的信息源,可将阈值化方法分为五类:1) 基于聚类的方法:数据聚类中,总的数据集被划分为属性相似的子类,例如将灰度级聚类成为两部分:前景物体部分和背景部分.2) 基于直方图的方法:在直方图的峰.谷和直方图的圆滑曲线上进行分析.3) 基于熵的方法:熵方法将区域分为背景区域和前景区域,前景区域通常是物体部分(在一些热红外图像中,背景部分是物体) .该方法是通过最小

OpenCV中感兴趣区域的选取与检测(一)

1.感兴趣区域的选取 感兴趣区域(Region of Interest, ROI)的选取,一般有两种情形:1)已知ROI在图像中的位置:2)ROI在图像中的位置未知. 1)第一种情形 很简单,根据ROI的坐标直接从原图抠出,不过前提是要知道其坐标,直接上例子吧. int getROI(Mat image, Rect rect) { Mat img=image.clone(); Mat roi; int cols=img.cols, rows=img.rows; //ROI越界,返回 if(col

OpenCV中feature2D学习——FAST特征点检测

在前面的文章<OpenCV中feature2D学习--SURF和SIFT算子实现特征点检测>中讲了利用SIFT和SURF算子进行特征点检测,这里尝试使用FAST算子来进行特征点检测. FAST的全名是:Features from Accelerated Segment Test,主要特点值计算速度快,比已知的其他特征点检测算法要快很多倍,可用于计算机视觉应用的实时场景.目前以其高计算效率(computational performance).高可重复性(highrepeatability)成为