Python 中 OpenCV 的 GUI 特性

Manav Narula 2024年2月15日
  1. 在 Python 中使用 OpenCV 读取和写入图像
  2. 在 Python 中使用 OpenCV 绘制图像
  3. 带有轨迹栏的调色板在 Python 中使用 OpenCV
  4. 结论
Python 中 OpenCV 的 GUI 特性

GUI 代表图形用户界面,它允许用户使用键盘和鼠标等硬件设备与程序进行交互。GUI 提供了一个相对容易使用的视觉上吸引人的界面。

opencv 库实现了可以应用不同技术处理图像的各种函数和对象。我们可以使用这个库非常有效地读取和处理图像。

本教程将使用 Python 的 opencv 库演示不同的 GUI 技术。

在 Python 中使用 OpenCV 读取和写入图像

最基本的 GUI 技术与读取和显示图像相关。opencv 库使用 imshow() 函数创建一个显示图像的窗口。

我们可以使用 imread() 函数预先读取图像,甚至使用 imwrite() 方法将其保存在某个指定路径上。

Python 解释器会在程序执行后立即关闭创建的窗口,我们可以使用 waitKey() 函数来防止这种情况发生。该函数等待用户按下某个键,然后恢复程序执行。

我们可以使用 destroyAllWindows() 函数根据用户要求关闭窗口。让我们看一个工作示例。

代码示例:

import cv2

img = cv2.imread("obj.png")
cv2.imshow("Show image", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.imwrite("Newimage.png", img)

输出:

True

在 python 中使用 opencv gui 读写图像

该代码使用 imread() 函数读取图像并使用 imshow() 函数显示它。然后我们等待用户在恢复执行之前按下某个键。

按下某个键后,将关闭创建的窗口。然后 imwrite() 函数继续将给定图像保存到指定路径。

请注意,我们还在函数中指定文件名及其格式。该函数返回 True,表示文件已成功写入。

在 Python 中使用 OpenCV 绘制图像

opencv 库还提供了在图像上绘图的功能。我们可以使用 line()rectangle()circle() 等函数在图像上绘制不同的形状。

我们可以在之前阅读的图像上绘制这些形状。

代码示例:

import cv2

img = cv2.imread("obj.png")

cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
cv2.rectangle(img, (400, 0), (510, 128), (255, 255, 0), 3)
cv2.imshow("Show image", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.imwrite("Newimage.png", img)

输出:

True

在 Python 中使用 OpenCV 绘制图像

在上面的示例中,我们向输入图像添加了一条线和一个矩形,然后将其保存在某个位置。

line() 函数将线条添加到图像中。我们指定线条的起点和终点坐标以及粗细和颜色代码。

rectangle() 函数创建一个矩形。此函数指定右下角和左上角坐标以及颜色代码和厚度。

绘制图像后,我们使用 imwrite() 函数将其导出到设备。

我们还可以将鼠标用作画笔,并在给定图像上所需的位置添加形状或线条。如前所述,opencv 库具有可以读取和检测用户输入的函数,例如 waitKey() 函数。

该库存储不同的事件,例如鼠标左键单击、鼠标右键单击等等。我们可以等待用户执行一些事件,然后根据事件调用函数。

首先,我们需要使用 namedWindow() 方法创建一个窗口,并为该窗口分配一个标题。setMouseCallback() 处理某些指定窗口上的鼠标事件。

我们可以在函数中指定窗口标题。我们还需要指定一个需要执行的函数。

代码示例:

import cv2


def add_circle(e, x, y, flags, param):
    if e == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img, (x, y), 25, (0, 0, 255), -1)


img = cv2.imread("obj.png")
cv2.namedWindow("Draw")
cv2.setMouseCallback("Draw", add_circle)

while True:
    cv2.imshow("Draw", img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

输出:

使用 opencv python 在图像上绘制形状(圆形)

让我们理解上面示例中的代码。首先,我们读取图像并使用 namedWindow() 函数创建一个窗口。

我们创建了一个函数 add_circle(),它接受事件、坐标、标志和其他参数。我们通过双击鼠标左键(cv2.EVENT_LBUTTONDBLCLK)检查事件是否相同。

当鼠标在窗口上双击时,条件为 True,我们将坐标传递给 circle() 函数,该函数在鼠标单击的位置创建一个圆。我们创建一个循环来重复执行此操作。

必须按下 Escape 键才能跳出循环。waitKey() 函数检测按下的键。

带有轨迹栏的调色板在 Python 中使用 OpenCV

让我们继续使用 Python 中的 opencv 来了解更复杂的 GUI 技术。使用黑屏可以更好地理解这一点。

我们将为此创建一个三维的 numpy 数组,该数组用零填充,并将用作黑屏。然后,我们将使用 namedWindow() 方法为该图像创建一个窗口,就像我们在前面的示例中所做的那样。

现在我们需要创建轨迹栏。我们将通过使用轨迹栏更改其 RGB 值来控制此黑屏的调色板。

要创建轨迹栏,我们使用 createTrackbar() 函数。此方法将创建一个跟踪栏,将其附加到提供的窗口,并在函数内指定跟踪栏的图像对象和范围。

在我们的例子中,范围是从 0255。它还需要一个 OnChange 参数,其中包含一个在每次滑块位置更改时都需要调用的函数。

当位置改变时,我们不需要一个函数来执行任何操作。因此,我们将创建一个不执行任何操作且仅包含 pass 语句的函数。

我们将创建一个循环,直到按下特定键为止。在这个循环中,我们将使用 getTrackbarPos() 位置获取滑块的当前位置,我们将根据跟踪器位置设置此图像的 RBG 值。

代码示例:

import cv2
import numpy as np


def ignore(x):
    pass


img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow("rgb_palette")

cv2.createTrackbar("R", "rgb_palette", 0, 255, ignore)
cv2.createTrackbar("G", "rgb_palette", 0, 255, ignore)
cv2.createTrackbar("B", "rgb_palette", 0, 255, ignore)

while True:
    cv2.imshow("rgb_palette", img)
    c = cv2.waitKey(1) & 0xFF
    if c == 27:
        break

    R = cv2.getTrackbarPos("R", "rgb_palette")
    G = cv2.getTrackbarPos("G", "rgb_palette")
    B = cv2.getTrackbarPos("B", "rgb_palette")

    img[:] = [B, G, R]

cv2.destroyAllWindows()

带有轨迹栏的调色板在 Python 中使用 OpenCV

在上面的例子中,我们在 Python 中使用 opencv 创建了一个 RGB 调色板。我们为红色、绿色和蓝色值创建三个轨迹栏。

我们在滑块上更改它们的值,这反映在图像(黑屏)上。要跳出循环,我们可以按下 Escape> 键,使用 waitKey() 函数来检测按下的键。

结论

本教程演示了与 Python 的 opencv 库相关的各种 GUI 技术和功能。我们详细演示了这些技术。

使用 opencv 库读取和写入图像可以被认为是最简单的 GUI 功能,因为图像显示在新创建的窗口中。我们也可以导出此图像并将其保存在设备上。

然后,我们讨论了如何使用 opencv 在图像上绘制形状和线条。我们讨论了可用于绘制这些形状的函数,并通过向其添加用户交互和使用鼠标单击绘制形状来添加更多 GUI 功能。

在最后的 GUI 功能中,我们演示了轨迹栏的使用。这些是用户可以更改的滑块。

我们创建一个 RGB 调色板轨迹栏。值发生了变化,我们观察屏幕上的变化。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

相关文章 - Python OpenCV