我正在参加「掘金·启航计划」
鼠标指针是图形用户界面 (GUI) 中的关键组件。没有它,您就无法真正考虑与 GUI 进行交互。那么,让我们深入了解 OpenCV 中鼠标和轨迹栏的内置函数。我们将演示如何使用鼠标来注释图像,以及如何使用轨迹栏来控制图像的大小。
使用鼠标注释图像
OpenCV 提供了鼠标事件检测功能来检测各种鼠标操作,例如左键单击和右键单击。在第一个示例中,我们将向您展示如何使用鼠标在命名窗口中显示的图像上渲染矩形。
这是它的代码:
Python:
首先定义一个特殊的“回调”函数,该函数将在指定窗口中显示的图像上绘制一个矩形。仅当检测到某些用户界面事件时才调用,此类函数被称为“回调”函数。在这里,这个特定的函数与鼠标事件相关联,因此我们将其定义为MouseCallback函数。不过,您可以随意命名该函数。在本例中,我们将其命名为**
drawRectangle()
** . 这是可行的,因为我们将注册这个函数名称以与鼠标事件关联。您无需为该函数指定任何输入参数,当用户与鼠标交互时,这些参数将自动填充。
让我们了解如何将此函数与特定的鼠标事件关联起来。如下所示,我们根据某些鼠标事件创建绘制矩形的逻辑。此处记录了可用的事件列表。每当用户与鼠标交互时,当鼠标位于正在显示的图像上时:记录鼠标事件类型和事件标志以及鼠标 x 和 y 坐标。然后将它们传递给函数进行处理。 *userdata
是一个可选参数,可以为回调函数提供进一步的输入(但在本例中我们不需要它)。当触发LEFTBUTTONDOWN和LEFTBUTTONUP操作时,我们将坐标存储在各自的变量中,并使用它们来绘制矩形。
定义好鼠标回调函数后,我们继续执行以下操作:
- 从磁盘读取示例图像,使用**
imread()
** copy()
使用或**clone()
** 对于 C++保存图像的副本- 创建一个命名窗口
调用**setMouseCallback()
** 以注册我们上面定义的鼠标回调函数,以及 ( drawRectangle()
) 来注册指定窗口中发生的鼠标事件。
该**setMouseCallback()
** 函数的一般语法如下所示,并在此处进行了记录。
Python:
cv2.setMouseCallback(winname, onMouse, userdata)
在最后一步中,我们需要创建一个显示循环,允许用户与指定窗口进行交互。因此,在下面的代码中,我们:
- 创建一个持续显示图像的 while 循环,直到用户按下“
q
”键(ASCII 代码:113)退出应用程序脚本。 - 在循环中为用户提供清除所有先前注释的功能。用户可以将命名窗口中的图像重置为我们读取原始图像时所做的副本。这只需检查键盘输入“
c
”(ASCII 代码:99)即可完成。 - 当用户退出循环时,我们使用 销毁窗口**
destroyAllWindows()
** 。
如果您不熟悉该功能的使用**waitKey()
**
Python:
k=0
# 当输入字符'q'关闭窗口
while k!=113:
# 销毁窗口
cv2.imshow("Window", image)
k = cv2.waitKey(0)
# 如果按下 c,则使用虚拟图像清除窗口
if (k == 99):
image= temp.copy()
cv2.imshow("Window", image)
执行时,此代码允许用户在图像上绘制一个或多个矩形,如下所示。请记住,在图像上绘制矩形只是使用鼠标指针的简单演示。真正的力量来自于知道您可以检测用户与图像的交互,并提供您的应用程序中可能需要的任何功能。
使用轨迹栏调整图像大小
现在,我们将演示如何使用轨迹栏来调整图像大小。看看这段代码:
Python:
- **
scaleFactor
**将在我们将定义用于缩放图像的回调函数中使用。 - **
maxScaleUp
**是轨迹条位置将记录的最大值。最好将 100 作为最大值,这样我们就可以使用轨迹栏位置直接以百分比形式缩放某些内容。 - 使用函数签名定义回调函数,如下所示(针对 Python)。
- 和以前一样,将函数命名为您喜欢的任意名称。在本例中,我们将其命名为**
scaleImage()
** . - 在 Python 代码中,从 中检索轨迹栏位置**
args[0]
** ,范围为 0 到 100。 - 根据轨迹栏位置计算 a
scaleFactor
,scaleFactor
并将其输入到resize()
函数中以调整图像大小。
在Python代码中,您不需要为图像指定任何数据类型。
要创建使用回调函数的跟踪栏,我们需要调用该**createTrackbar()
** 函数,如此处所述。在下面的代码中查看其语法。
Python:
cv2.createTrackbar( trackbarName, windowName, value, count, onChange)
概括
学习了创建可与用户发起的鼠标事件关联的回调函数。而且还可以使用**setMouseCallback()
** 和来注册它们**createTrackbar()
** 。使用这些基本组件.