【从零学习OpenCV 4】namedWindow函数&imshow函数的使用

重磅干货,第一时间送达

经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

1

01

图像窗口函数namedWindow

在我们之前的程序中并没有见到窗口函数,因为我们在显示图像时如果没有主动定义图像窗口,程序会自动生成一个窗口用于显示图像,然而有时我们需要在显示图像之前对图像窗口进行操作,例如添加滑动条,此时就需要提前创建图像窗口。代码清单2-25中给出了创建窗口函数的原型。

代码清单2-25 namedWindow()函数的原型
void cv::namedWindow(const String & winname,
                        int  flags = WINDOW_AUTOSIZE
                        )
  • winname:窗口名称,用作窗口的标识符

  • flags:窗口属性设置标志

该函数会创建一个窗口变量,用于显示图像和滑动条,通过窗口的名称引用该窗口,如果在创建窗口时已经存在具有相同名称的窗口,则该函数不会执行任何操作。创建一个窗口需要占用部分内存资源,因此通过该函数创建窗口后,在不需要窗口时需要关闭窗口来释放内存资源。OpenCV提供了两个关闭窗口资源的函数,分别是cv::destroyWindow()函数和cv :: destroyAllWindows(),通过名称我们可以知道前一个函数是用于关闭一个指定名称的窗口,即在括号内输入窗口名称的字符串即可将对应窗口关闭,后一个函数是关闭程序中所有的窗口,一般用于程序的最后。不过事实上,在一个简单的程序里,我们并不需要调用这些函数,因为程序退出时会自动关闭应用程序的所有资源和窗口。虽然不主动释放窗口也会在程序结束时释放窗口资源,但是OpenCV 4.0版本在结束时会报出没有释放窗口的错误,而OpenCV 4.1版本则不会报错。

该函数的第一个参数是声明窗口的名称,用于窗口的唯一识别,第二个参数是声明窗口的属性,主要用于设置窗口的大小是否可调、显示的图像是否填充满窗口等,具体可选择的参数及含义在表2-4中给出,默认情况下,函数加载的标志参数为“WINDOW_AUTOSIZE | WINDOW_KEEPRATIO | WINDOW_GUI_EXPANDED”。

表2-4 namedWindow()函数窗口属性标志参数

标志参数

简记

作用

WINDOW_NORMAL

0x00000000

显示图像后,允许用户随意调整窗口大小

WINDOW_AUTOSIZE

0x00000001

根据图像大小显示窗口,不允许用户调整大小

WINDOW_OPENGL

0x00001000

创建窗口的时候会支持OpenGL

WINDOW_FULLSCREEN

1

全屏显示窗口

WINDOW_FREERATIO

0x00000100

调整图像尺寸以充满窗口

WINDOW_KEEPRATIO

0x00000000

保持图像的比例

WINDOW_GUI_EXPANDED

0x00000000

创建的窗口允许添加工具栏和状态栏

WINDOW_GUI_NORMAL

0x00000010

创建没有状态栏和工具栏的窗口

1

02

图像显示函数imshow

我们在前面已经见过了图像显示函数imshow()的调用方式,这里我们给出函数的原型。

代码清单2-26 imshow()函数的原型
void cv::imshow(const String & winname,
                  InputArray mat
                  )
  • winname:要显示图像的窗口的名字,用字符串形式赋值

  • mat:要显示的图像矩阵

该函数会在指定的窗口中显示图像,如果在此函数之前没有创建同名的图像窗口,就会以WINDOW_AUTOSIZE标志创建一个窗口,显示图像的原始大小,如果创建了图像窗口,则会缩放图像以适应窗口属性。该函数会根据图像的深度将其缩放,具体缩放规则为:

  • 如果图像是8位无符号类型,则按照原样显示

  • 如果图像是16位无符号类型或者32位整数类型,则会将像素除以256,将范围由[0,255*256]映射到[0,255]

  • 如果图像时32位或64位浮点类型,则将像素乘以255,即将范围由[0,1]映射到[0,255]

函数中第一个参数为图像显示窗口的名称,第二个参数是需要显示的图像Mat类矩阵。这里需要特殊说明的是,我们看到第二个参数并不是常见的Mat类,而是InputArray,这个是OpenCV定义的一个类型声明引用,用作输入参数的标识,我们在遇到它时可以认为是需要输入一个Mat类数据。同样,OpenCV对输出也定义了OutputArray类型,我们同样可以认为是输出一个Mat类数据。

注意

此函数运行后会继续执行后面程序,如果后面程序执行完直接退出的话,那么显示的图像有可能闪一下就消失了,因此在需要显示图像的程序中,往往会在imshow()函数后跟有cv::waitKey()函数,用于将程序暂停一段时间。waitKey()函数是以毫秒计的等待时长,如果参数缺省或者为“0”表示等待用户按键结束该函数。

(0)

相关推荐

  • OpenCV-Python学习教程.2

    如果你用Linux得设备,可能会用到这里来看有没有设备被安全挂载.因为没有一个图形化的页面来方便的查看. 子Linux不是太好使 # 获取视频帧的宽w = fcap.get(cv2.CAP_PROP_ ...

  • OpenCV探索之路(四):膨胀、腐蚀、开闭运算

    腐蚀和膨胀是最基本的形态学运算. 腐蚀和膨胀是针对白色部分(高亮部分)而言的. 膨胀就是对图像高亮部分进行"领域扩张",效果图拥有比原图更大的高亮区域:腐蚀是原图中的高亮区域被蚕食 ...

  • opencv3错误集锦(四)——Rect函数参数引发的异常中断

    opencv3错误集锦(四)——Rect函数参数引发的异常中断

  • 【从零学习OpenCV 4】图像读取函数imread

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】深度神经网络应用实例

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】图像修复

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——Mean-Shift分割算法

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——Grabcut图像分割

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——分水岭法

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】QR二维码检测

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】图像矩的计算与应用

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】轮廓外接多边形

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...