问题描述:
创建一个简单的程序:通过调节滑动条来设定画板颜色。我们要创建一个窗口来显示显色,还有三个滑动条来设置B,G,R的颜色。当我们滑动滚动条是窗口的颜色也会发生相应改变。默认情况下窗口的起始颜色为黑。
import cv2
import numpy as np
# 创建回调函数
def nothing(x):
pass
# 创建一副色图像
img = np.zeros((300, 512, 3), np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R', 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)
switch = '0:OFF\n1:ON'
cv2.createTrackbar(switch, 'image', 0, 1, nothing)
while (1):
cv2.imshow('image', img)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
r = cv2.getTrackbarPos('R', 'image')
g = cv2.getTrackbarPos('G', 'image')
b = cv2.getTrackbarPos('B', 'image')
s = cv2.getTrackbarPos(switch, 'image')
if s == 0:
img[:] = 0
else:
img[:] = [b, g, r]
cv2.destroyAllWindows()
逐行分析上述代码的逻辑结构。
img = np.zeros((300, 512, 3), np.uint8)
cv2.namedWindow('image')这里面的img和image有什么区别呢?
问题解答:
以下是逐行分析上述代码的逻辑结构:
-
导入库:
import cv2 import numpy as np
导入 OpenCV 和 NumPy 库,用于图像处理和数组操作。
-
创建回调函数:
def nothing(x): pass
定义一个空的回调函数
nothing
,用于滑块的回调,当前不执行任何操作。 -
创建一副色图像:
img = np.zeros((300, 512, 3), np.uint8)
创建一个 300 高、512 宽、3 通道(RGB)的全黑图像,数据类型为无符号 8 位整数。
-
创建窗口:
cv2.namedWindow('image')
创建一个名为
'image'
的窗口,以便在其中显示图像。 -
创建滑块:
cv2.createTrackbar('R', 'image', 0, 255, nothing) cv2.createTrackbar('G', 'image', 0, 255, nothing) cv2.createTrackbar('B', 'image', 0, 255, nothing)
创建三个滑块,分别用于调整红色(R)、绿色(G)和蓝色(B)通道的强度,范围从 0 到 255。
-
创建开关滑块:
switch = '0:OFF\n1:ON' cv2.createTrackbar(switch, 'image', 0, 1, nothing)
创建一个开关滑块,用于控制图像是否显示颜色,0 为关闭,1 为开启。
-
显示窗口循环:
while (1): cv2.imshow('image', img) k = cv2.waitKey(1) & 0xFF if k == 27: break
进入一个无限循环,不断显示图像,并检查按键。如果按下
Esc
键(ASCII 27),则退出循环。 -
获取滑块值:
r = cv2.getTrackbarPos('R', 'image') g = cv2.getTrackbarPos('G', 'image') b = cv2.getTrackbarPos('B', 'image') s = cv2.getTrackbarPos(switch, 'image')
从滑块获取当前 RGB 值和开关状态。
-
更新图像:
if s == 0: img[:] = 0 else: img[:] = [b, g, r]
根据开关状态更新图像:如果开关为关闭(0),则将图像设为黑色;如果开启(1),则根据 RGB 滑块的值更新图像的颜色。
-
关闭窗口:
cv2.destroyAllWindows()
退出循环后,关闭所有 OpenCV 创建的窗口。
区别:
img
是一个 NumPy 数组,代表实际的图像数据,包含颜色信息。'image'
是窗口的名称,用于在 OpenCV 中显示img
图像的窗口。它们之间没有直接关系,img
是数据,'image'
是展示数据的窗口的标识。