OpenCV中waitKey()函数的深度解析

while (char(waitKey(1)) != ‘q’) {}

相信不少,都是冲着这句代码来的,是不是无法退出?

注意:鼠标必须激活当前窗口, 即鼠标要点一下窗口(图像),不然要是放在cmd窗口,无法键入字符。

下面我们先深入解读waitKey()这个函数。

解读waitKey()函数

OpenCV源码里对这个函数有一段说明:

This function should be followed by cv::waitKey function which displays the image for specified
milliseconds. Otherwise, it won’t display the image. For example, waitKey(0) will display the window
infinitely until any keypress (it is suitable for image display). waitKey(25) will display a frame
for 25 ms, after which display will be automatically closed. (If you put it in a loop to read
videos, it will display the video frame-by-frame)

翻译

这个函数后面应该是cv::waitKey函数,它显示指定的图像。毫秒。否则,它就不会显示图像。例如,waitKey(0)将无限地显示窗口,直到任何按键按下(它适合于图像显示)。waitKey(25)将显示一个框架。25毫秒后,显示将自动关闭。(如果你把它放到一个循环中去读。视频,它将显示视频帧逐帧。

结论:
1.waitKey()与waitKey(0),都代表无限等待,waitKey函数的默认参数就是int delay = 0,故这俩形式本质是一样的。

2.waitKey(n),等待n毫秒后,关闭显示的窗口。

下面3、4的在本文的程序中得到了验证

3.当等待时间内无任何操作时等待结束后返回-1。
4.当等待时间内有输入字符时,则返回输入字符的ASCII码对应的十进制值。

解读:while (char(waitKey(1)) != ‘q’) {}

1.这是个while循环,循环条件是char(waitKey(1)) != ‘q’
2.waitKey(1)为等待1ms,加上while循环,即为无限等待,当输入字符则waitKey()返回当前字符的ASCII码对应的十进制值,然后char()将ASCII码转换为字符,最后判断是否与‘q’对等。若键入字符为q,则停止循环,窗口不再等待,即退出窗口了。

其实

把char去掉也可以,这里进行了自动类型转换。
即while (waitKey(1)) != ‘q’) {},也能达到效果

还有其他形式的写法

1.while ((char)waitKey(1) != ‘q’) {} ,用char强转类型

2.while (1) { if (waitKey(1) == ‘q’) { break; } },这种也可以达到效果

/**
 *Copyright (c) 2018 Young Fan.All Right Reserved.
 *Filename: 4.1 testWaitKey
 *Author: Young Fan
 *Date: 2018.4.20
 *OpenCV version: 3.4.1
 *IDE: Visual Studio 2017
 *Description: 研究与测试WaitKey()函数
 */

#include<opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{

    namedWindow("Test1");

    //鼠标必须激活当前窗口, 即鼠标要点一下窗口,不然要是放在cmd窗口,无法键入字符
    //下面的1~6部分,最好单独分别运行,才能顺利验证各个部分

    //1.
    cout << endl << "按下“q”键时,程序退出。\n";
    while ((char)waitKey(1) != 'q') {}

    //2.
    //while (waitKey(1) != '1') {}

    //3.
    //while (1) { if (waitKey(1) == 'q') { break; } }//或者这样写,

    //4.
    //cout << waitKey() << endl;;//按下字符,会打印显示当前键入得ASCII码对应的十进制值,即键盘上的字符

    //5.
    //int x = waitKey();//按下字符,会打印显示当前键入得ASCII码对应的十进制值
    //cout << " x = " << x << endl;

    //6.
    //char y = waitKey();//按下字符,会打印显示当前键入得ASCII码
    //cout << " y = " << y << endl;

    //7.
    int c = waitKey(2);//等待时间内无任何操作时等待结束后返回-1
    cout << " c = " << c << endl;//输出c = -1

    return 0;
}
  • 34
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
C#的`cv2.subtract()`函数OpenCV的一个函数,用于计算两个图像之间的差异。它可以用来实现图像处理的减法操作。 函数的语法如下: ```csharp Cv2.Subtract(Mat src1, Mat src2, Mat dst); ``` 参数说明: - `src1`:第一个输入图像。 - `src2`:第二个输入图像。 - `dst`:输出图像,表示两个输入图像的差异。 函数会将`src2`从`src1`减去,并将结果存储在`dst`。这意味着函数会对应位置上的像素值进行减法运算,得到的差值将会存储在输出图像。 需要注意的是,输入图像和输出图像的尺寸、深度等应该相同,否则函数可能会出错。 以下是一个简单的示例,展示了如何使用`cv2.subtract()`函数进行图像减法操作: ```csharp using OpenCvSharp; class Program { static void Main() { // 读取两个输入图像 Mat src1 = new Mat("image1.jpg", ImreadModes.Color); Mat src2 = new Mat("image2.jpg", ImreadModes.Color); // 创建输出图像 Mat dst = new Mat(); // 进行图像减法操作 Cv2.Subtract(src1, src2, dst); // 显示结果图像 Cv2.ImShow("Subtracted Image", dst); Cv2.WaitKey(0); // 释放图像资源 src1.Dispose(); src2.Dispose(); dst.Dispose(); } } ``` 上述示例,`src1`和`src2`是两个输入图像,`dst`是输出图像。通过调用`Cv2.Subtract()`函数,将`src2`从`src1`减去,并将结果存储在`dst`。最后,使用`Cv2.ImShow()`函数显示输出图像。 希望这个解析对你有帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值