《OpenCV 4计算机视觉项目实战 》 —3.4 Qt图形用户界面
3.4 Qt图形用户界面
Qt用户界面为我们提供了更多控制和选项来处理图像。
其界面分为以下三个主要区域:
工具栏
图像区域
状态栏
我们可以在图3-4中看到这三个区域。图像上面是工具栏,中间是图像区域,底部是状态栏。
图 3-4
工具栏从左到右具有以下按钮:
用于平移的四个按钮
缩放x1
缩放x30,显示标签
放大
缩小
保存当前图像
显示属性
可以在图3-5中清楚地看到这些选项。
图 3-5
图像区域显示图像,并且当我们在图像上按下鼠标右键时显示上下文菜单。这个区域可以使用displayOverlay函数在该区域顶部显示叠加消息,该函数接受三个参数:窗口名称、要显示的文本以及显示叠加文本的时间(以毫秒为单位)。如果这个时间设置为0,则文本永远不会消失:
我们可以在图3-6中看到前面代码的运行结果。你可以在图像顶部看到一个小黑框,其中包含字符串“Overse 5secs”:
图 3-6
最后,状态栏在窗口的底部显示图像中的像素值和坐标位置,如图3-7所示。
图 3-7
我们可以在状态栏中像叠加层一样显示消息,displayStatusBar函数可以更改状态栏的消息。该函数具有与叠加函数相同的参数:窗口名称、要显示的文本和文本的显示时间,如图3-8所示。
图 3-8
将按钮添加到用户界面
在前面的部分中,我们学习了如何创建一般界面或者Qt界面,并使用鼠标和滑块与它们进行交互,但我们也可以创建不同类型的按钮。
只有在Qt窗口中才支持按钮。
OpenCV Qt支持的按钮类型如下:
按钮
复选框
单选框
这些按钮仅出现在控制面板中。控制面板是每个程序的独立窗口,我们可以在其中附加按钮和跟踪条。要显示控制面板,我们可以按下最后一个工具栏按钮,右键单击Qt窗口的任何部分,并选择“显示属性”窗口,或者用Ctrl + P快捷键。让我们用按钮创建一个基本的例子。代码较长,我们首先解释主函数,然后分别解释每个回调函数,以便更好地理解所有内容。以下代码向我们展示生成用户界面的主函数代码:
我们应用三种类型的滤镜:模糊、Sobel过滤器以及将颜色转换为灰色。所有这些都是可选的,用户可以使用要创建的按钮选择每一种滤镜。然后,为了获得每个过滤器的状态,我们创建了三个全局布尔变量:
在main函数中,在加载图像并创建窗口之后,必须使用createButton函数来创建每个按钮。
OpenCV中定义了三种按钮类型:
QT_CHECKBOX
QT_RADIOBOX
QT_PUSH_BUTTON
每个按钮有五个参数,按顺序如下所示:
1. 按钮名称
2. 回调函数
3. 传递给回调函数的用户变量数据的指针
4. 按钮类型
5. 用于复选框和单选框按钮类型的默认初始化状态
然后,创建一个模糊复选框按钮,两个用于颜色转换的单选框按钮,以及一个用于sobel过滤器的按钮,如下面的代码所示:
这些是main函数中最重要的部分。我们将探讨回调(Callback)函数。每个回调函数都会更改其状态变量以调用另一个名为applyFilters的函数,以便将激活的过滤器添加到输入图像:
applyFilters函数检查每个过滤器的状态变量:
要将颜色更改为灰色,我们使用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阶导数,必须使用以下参数:
以下参数用于y阶导数:
在这个例子中,我们同时使用x和y导数来重写输入。以下代码段显示如何通过在第四个和第五个参数中添加1来同时生成x和y导数:
同时应用x和y导数的结果看起来像应用于Lena图片的图3-9。
图 3-9
- 点赞
- 收藏
- 关注作者
评论(0)