欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenCV4萌新之路——详解图像显示三兄弟 “imshow”、“namedWindow” 和“waitKey”

程序员文章站 2022-05-20 22:09:45
...


上一篇"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

任意起一个名字作为图像显示的窗口名称,显示在左上角,如下图箭头所示位置。
OpenCV4萌新之路——详解图像显示三兄弟 “imshow”、“namedWindow” 和“waitKey”

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,不知道是否和屏幕分辨率相关,有哪位大神知道还望不吝赐教。
OpenCV4萌新之路——详解图像显示三兄弟 “imshow”、“namedWindow” 和“waitKey”

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
OpenCV4萌新之路——详解图像显示三兄弟 “imshow”、“namedWindow” 和“waitKey”
尴尬,只好再去重新编译一次了。

四、参考文献

  1. High-level GUI.