OpenCV4萌新之路——详解图像显示三兄弟 “imshow”、“namedWindow” 和“waitKey”
程序员文章站
2022-05-20 22:09:45
...
OpenCV4萌新之路——详解图像显示三兄弟 “imshow”、“namedWindow” 和“waitKey”
上一篇"OpenCV4萌新之路——详解图像读取函数 “imshow”"讲了imread的使用方法,就用到其中两个函数:imshow和waitKey。
void cv::imshow(const String & winname, InputArray mat);
int cv::waitKey(int delay = 0);
void cv::namedWindow(const String & winname,int flags = WINDOW_AUTOSIZE);
一、函数简析
头文件 #include <opencv2/highgui.hpp>
imshow | 返回类型 | 命名空间 | 函数名 | 参数1 | 参数2 |
---|---|---|---|---|---|
详细 | void | cv | imshow | const String & winname | InputArray mat |
详细 | - | - | - | 窗口标题名 | 输入待显示的图像数组 |
waitKey | 返回类型 | 命名空间 | 函数名 | 参数1 |
---|---|---|---|---|
详细 | void | cv | waitKey | int delay = 0 |
详细 | - | - | - | 等待时间(ms) |
namedWindow | 返回类型 | 命名空间 | 函数名 | 参数1 | 参数2 |
---|---|---|---|---|---|
详细 | void | cv | namedWindow | const String & winname | int flags = WINDOW_AUTOSIZE |
详细 | - | - | - | 窗口标题名 | 窗口类型 |
二、参数详解
1.1 const String & winname
任意起一个名字作为图像显示的窗口名称,显示在左上角,如下图箭头所示位置。
1.2 InputArray mat
输入图像除了8-bit unsigned,其他的全部会将数字映射到[0,255]。
2.1 int delay = 0
如果输入参数小于等于0,则图像显示窗口会一直存在,直到按下任意键后销毁窗口。
如果输入参数大于0,则等待对应毫秒数后自动销毁窗口。
如果等待过程中你按下任何键,程序销毁窗口,并返回键盘按键对应的keyCode值。
如果等待时间到了,程序自动销毁窗口,并返回-1。
3.1 const String & winname
同1.1
3.2 int flags = WINDOW_AUTOSIZE
值 | 枚举名 | 定义 | 解释 |
---|---|---|---|
0x00000000 | WINDOW_NORMAL | the user can resize the window (no constraint) / also use to switch a fullscreen window to a normal size. | 用户可以无限制的改变窗口的大小 |
0x00000001 | WINDOW_AUTOSIZE | the user cannot resize the window, the size is constrainted by the image displayed. | 窗口固定位图像大小,不可改变 |
0x00001000 | WINDOW_OPENGL | window with opengl support. | 支持 ogl::Buffer , ogl::Texture2D 和cuda::GpuMat三种类型的图像显示 |
1 | WINDOW_FULLSCREEN | change the window to fullscreen. | 全屏显示 |
0x00000100 | WINDOW_FREERATIO | the image expends as much as it can (no ratio constraint). | 无限制缩放 |
0x00000000 | WINDOW_KEEPRATIO | the ratio of the image is respected. | 按图像原始比例缩放 |
0x00000000 | WINDOW_GUI_EXPANDED | status bar and tool bar | |
0x00000010 | WINDOW_GUI_NORMAL | old fashious way |
三、测试代码
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
#define IMAGE_ABSOLUTE_PATH "F:/Leraning_OpenCV4/Sakai_Izumi.jpg" //绝对路径
#define IMAGE_RELATIVE_PATH "./Sakai_Izumi.jpg" //相对路径(
int main()
{
//读取图片
Mat src = imread(IMAGE_ABSOLUTE_PATH, 0);
//Mat src = imread(IMAGE_RELATIVE_PATH, 1);
//判读是否成功读取图片
if (src.empty())
{
std::cout << "Load img failed!" << endl;
return 0;
}
else
{
std::cout << "Load img success!" << endl;
}
//显示图片
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
int rv = waitKey(0);
cout << rv << endl;
return 1;
}
四. 其他测试
1.无限制缩放?
测试后发现,最小只能缩放到114*60,不知道是否和屏幕分辨率相关,有哪位大神知道还望不吝赐教。
2.支持OpenGL
创建的窗口支持OpenGL
namedWindow("src", WINDOW_OPENGL);
imshow("src", src);
waitKey(0);
测试的时候发现编译的时候没有添加OpenGL,报错如下
OpenCV(4.3.0) Error: No OpenGL support (Library was built without OpenGL support) in cvNamedWindow
尴尬,只好再去重新编译一次了。