《OpenCV 4计算机视觉项目实战 》 —3.4 Qt图形用户界面

举报
华章计算机 发表于 2019/11/10 12:26:29 2019/11/10
【摘要】 本节书摘来自华章计算机《OpenCV 4计算机视觉项目实战》 一书中第三章,第3.4节,作者[西班牙]大卫·米兰·埃斯克里瓦(David Millán Escrivá)[西班牙]维尼休斯·G.门东萨(Vinícius G. Mendon)。

3.4 Qt图形用户界面

Qt用户界面为我们提供了更多控制和选项来处理图像。

其界面分为以下三个主要区域:

工具栏

图像区域

状态栏

我们可以在图3-4中看到这三个区域。图像上面是工具栏,中间是图像区域,底部是状态栏。

 image.png

图 3-4

工具栏从左到右具有以下按钮:

用于平移的四个按钮

缩放x1

缩放x30,显示标签

放大

缩小

保存当前图像

显示属性

可以在图3-5中清楚地看到这些选项。

 image.png

图 3-5

图像区域显示图像,并且当我们在图像上按下鼠标右键时显示上下文菜单。这个区域可以使用displayOverlay函数在该区域顶部显示叠加消息,该函数接受三个参数:窗口名称、要显示的文本以及显示叠加文本的时间(以毫秒为单位)。如果这个时间设置为0,则文本永远不会消失:

 image.png

我们可以在图3-6中看到前面代码的运行结果。你可以在图像顶部看到一个小黑框,其中包含字符串“Overse 5secs”:

 image.png

图 3-6

最后,状态栏在窗口的底部显示图像中的像素值和坐标位置,如图3-7所示。

 image.png

图 3-7

我们可以在状态栏中像叠加层一样显示消息,displayStatusBar函数可以更改状态栏的消息。该函数具有与叠加函数相同的参数:窗口名称、要显示的文本和文本的显示时间,如图3-8所示。

 image.png

图 3-8

将按钮添加到用户界面

在前面的部分中,我们学习了如何创建一般界面或者Qt界面,并使用鼠标和滑块与它们进行交互,但我们也可以创建不同类型的按钮。

只有在Qt窗口中才支持按钮。

OpenCV Qt支持的按钮类型如下:

按钮

复选框

单选框

这些按钮仅出现在控制面板中。控制面板是每个程序的独立窗口,我们可以在其中附加按钮和跟踪条。要显示控制面板,我们可以按下最后一个工具栏按钮,右键单击Qt窗口的任何部分,并选择“显示属性”窗口,或者用Ctrl + P快捷键。让我们用按钮创建一个基本的例子。代码较长,我们首先解释主函数,然后分别解释每个回调函数,以便更好地理解所有内容。以下代码向我们展示生成用户界面的主函数代码:

 image.png

我们应用三种类型的滤镜:模糊、Sobel过滤器以及将颜色转换为灰色。所有这些都是可选的,用户可以使用要创建的按钮选择每一种滤镜。然后,为了获得每个过滤器的状态,我们创建了三个全局布尔变量:

 image.png

在main函数中,在加载图像并创建窗口之后,必须使用createButton函数来创建每个按钮。

OpenCV中定义了三种按钮类型:

QT_CHECKBOX

QT_RADIOBOX

QT_PUSH_BUTTON

每个按钮有五个参数,按顺序如下所示:

1. 按钮名称

2. 回调函数

3. 传递给回调函数的用户变量数据的指针

4. 按钮类型

5. 用于复选框和单选框按钮类型的默认初始化状态

然后,创建一个模糊复选框按钮,两个用于颜色转换的单选框按钮,以及一个用于sobel过滤器的按钮,如下面的代码所示:

 image.png

这些是main函数中最重要的部分。我们将探讨回调(Callback)函数。每个回调函数都会更改其状态变量以调用另一个名为applyFilters的函数,以便将激活的过滤器添加到输入图像:

 image.png

applyFilters函数检查每个过滤器的状态变量:

 image.png

image.png

要将颜色更改为灰色,我们使用cvtColor函数,该函数接受三个参数:输入图像、输出图像和颜色转换类型。

最有用的颜色空间转换如下:

RGB或BGR到灰度(COLOR_RGB2GRAY, COLOR_BGR2GRAY)

RGB或BGR到YcrCb (或YCC) (COLOR_RGB2YCrCb, COLOR_BGR2YCrCb)

RGB或BGR到HSV (COLOR_RGB2HSV, COLOR_BGR2HSV)

RGB或BGR到Luv (COLOR_RGB2Luv, COLOR_BGR2Luv)

灰度到RGB或BGR (COLOR_GRAY2RGB, COLOR_GRAY2BGR)

可以看到代码很容易记忆。

OpenCV默认使用BGR格式,而RGB和BGR的颜色转换不同,即使转换为灰度也是如此。一些开发人员认为R+G+B/3对于灰度是正确的,但最佳灰度值称为亮度(luminosity),并且具有公式:0.21*R + 0.72*G + 0,07*B。

模糊滤波器已经在前一节中做过描述,最后,如果applySobel变量为真,就应用sobel滤波器。sobel滤波器是使用sobel算子获得的图像导数,通常用于检测图像边缘。OpenCV能够生成具有内核大小的不同导数,但最常见的是用于计算x导数或y导数的3x3内核。

最重要的sobel参数如下:

输入图像

输出图像

输出图像深度(CV_8U,CV_16U,CV_32F,CV_64F)

导数x的阶

导数y的阶

内核大小(默认值为3)

要生成3×3内核和第一个x阶导数,必须使用以下参数:

 image.png

以下参数用于y阶导数:

 image.png

在这个例子中,我们同时使用x和y导数来重写输入。以下代码段显示如何通过在第四个和第五个参数中添加1来同时生成x和y导数:

 image.png

同时应用x和y导数的结果看起来像应用于Lena图片的图3-9。

 image.png

 

图 3-9


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。