Python OpenCV 使用轨迹栏动态修改图像背景色
本文详解如何利用OpenCV的cv.createTrackbar()函数创建轨迹栏,实现通过滑块实时改变图像背景颜色。结合鼠标回调函数,演示如何构建简易画板:在黑色背景上绘制图形,并通过轨迹栏开关一键清空画布刷新背景。代码涵盖BGR颜色值读取、窗口管理及事件处理,适合OpenCV初学者掌握GUI交互与图像处理基础。
OpenCV轨迹栏背景色修改教程
本文将深入讲解如何利用OpenCV修改图像背景颜色的基础方法,并附带一个综合练习,尝试将背景色修改功能应用于实际场景中。始终认为,在基础学习中加入更多探索,能让学习步伐更加坚定。
祝愿每一位努力前行的人都能坚持自己的道路,稳步向前。
实现轨迹栏功能的核心函数解析
关键参数详细说明
主要涉及两个函数:cv.createTrackbar()用于创建轨迹栏,cv.getTrackbarPos()用于获取轨迹栏当前的数值。
cv.createTrackbar()函数的具体参数如下:
- 第一个参数:trackbarname,即轨迹栏的名称标识。
- 第二个参数:winname,指定需要挂载该轨迹栏的窗口名称。
- 第三个参数:value,设定轨迹栏的初始默认值。
- 第四个参数:count,定义轨迹栏的最大上限值。
- 第五个参数:onChange,指定当轨迹栏值改变时触发的回调函数。
- (通常仅通过轨迹栏修改并读取数值时,此参数可忽略)第六个参数:userdata,作为传递给回调函数的用户数据。该参数允许在不使用全局变量的情况下处理轨迹栏事件,提高代码封装性。
cv.getTrackbarPos()函数的参数说明如下:
- 第一个参数:trackbarname,指定需要读取数值的轨迹栏名称。
- 第二个参数:winname,指定对应的窗口名称,必须与创建时一致。
轨迹栏函数参数详解
代码实现步骤
首先创建一个窗口,为后续挂载轨迹栏做准备。默认情况下,我们将初始化一张全黑色的图片作为背景。
import cv2 as cv
import numpy as np
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('imag', cv.WINDOW_NORMAL)
cv.resizeWindow('imag', 510, 510)
接着,将所需的轨迹栏添加到该窗口中。注意,必须定义轨迹栏的回调函数,即使该函数为空(使用pass语句),也必须存在,否则程序可能无法正常运行。
为了实现背景色的控制,我们设置三个独立的轨迹栏,分别对应BGR色彩空间中的蓝色、绿色和红色通道,每个轨迹栏的值域为0到255。
def nothing(x):
pass
# 参数依次为:设置轨迹(跟踪)栏名字,挂载的窗体, 默认值, 最大值,回调函数
cv.createTrackbar('R', 'imag', 0, 255, nothing) # R的值——nothing传入一个空函数体,不执行任何回调函数
cv.createTrackbar('G', 'imag', 0, 255, nothing) # G的值
cv.createTrackbar('B', 'imag', 0, 255, nothing) # B的值
switch = '1:ON\n0:OFF'
cv.createTrackbar(switch, 'imag', 0, 1, nothing)
# 设置一个开关——当为1时,图片背景可以改变——否则为黑色
显示主体部分的逻辑代码
while True:
cv.imshow('imag', img)
k = cv.waitKey(1) & 0xFF
if k == 27: # ESC退出
break
if cv.getTrackbarPos(switch, 'imag') == 1: # 当swtch轨迹(跟踪)栏的值为1时,允许改变背景色
img[:] = [cv.getTrackbarPos('B', 'imag'), cv.getTrackbarPos('G', 'imag'), cv.getTrackbarPos('R', 'imag')]
# getTrackbarPos的参数为:读取值的轨迹(跟踪)栏名,所在的窗体名
# opencv的颜色为BGR——依次获取轨迹(跟踪)栏的值就可以了~
else: # 否则为默认黑色
img[:] = 0
cv.destroyAllWindows()
运行效果展示
完整代码示例
import cv2 as cv
import numpy as np
def nothing(x):
pass
if __name__ == "__main__":
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('imag', cv.WINDOW_NORMAL)
cv.resizeWindow('imag', 510, 510)
cv.createTrackbar('R', 'imag', 0, 255, nothing)
cv.createTrackbar('G', 'imag', 0, 255, nothing)
cv.createTrackbar('B', 'imag', 0, 255, nothing)
switch = '1:ON\n0:OFF'
cv.createTrackbar(switch, 'imag', 0, 1, nothing)
while True:
cv.imshow('imag', img)
k = cv.waitKey(1) & 0xFF
if k == 27:
break
if cv.getTrackbarPos(switch, 'imag') == 1:
img[:] = [cv.getTrackbarPos('B', 'imag'), cv.getTrackbarPos('G', 'imag'), cv.getTrackbarPos('R', 'imag')]
else:
img[:] = 0
cv.destroyAllWindows()
实际运行效果
程序默认启动时的界面状态。

此时若调节背景色滑块,画面将保持不变(因为开关未开启)。

当开启开关后,背景色会随滑块调整实时发生变化。

综合训练:鼠标绘图与背景刷新
综合训练项目
训练目标要求
利用鼠标在图像上绘制图形,并将背景颜色的修改功能作为图片刷新(清空内容)的触发机制。
代码整体结构概览
鼠标回调函数实现(包含必要的库引用)。
import cv2 as cv
import numpy as np
drawing = False
line_size = 2
def mouse_function(event, x, y, flags, param): # 鼠标回调函数——执行鼠标左键按下后移动绘图
global drawing, line_size
if event == cv.EVENT_LBUTTONDOWN:
drawing = True
elif event == cv.EVENT_MOUSEMOVE:
if drawing is True:
cv.circle(img, (x, y), line_size, (0, 125, 255), -1, cv.LINE_AA)
elif event == cv.EVENT_LBUTTONUP:
drawing = False
cv.circle(img, (x, y), line_size, (0, 125, 255), -1, cv.LINE_AA)
轨迹栏回调函数实现。
# 这里不需要任何操作~所以用pass空函数体即可
def nothing(x):
pass
__main__主体代码
if __name__ == "__main__":
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('imag', cv.WINDOW_NORMAL)
cv.resizeWindow('imag', 510, 510)
cv.setMouseCallback('imag', mouse_function) # 实现鼠标回调函数
cv.createTrackbar('R', 'imag', 0, 255, nothing) # 设置R轨迹(跟踪)栏
cv.createTrackbar('G', 'imag', 0, 255, nothing)
cv.createTrackbar('B', 'imag', 0, 255, nothing)
switch = '1:ON\n0:OFF'
cv.createTrackbar(switch, 'imag', 0, 1, nothing) # 设置开关控制轨迹(跟踪)栏
while True:
cv.imshow('imag', img)
k = cv.waitKey(1) & 0xFF
if k == 27:
break
if cv.getTrackbarPos(switch, 'imag') == 1: # 为1是,刷新画面
img[:] = [cv.getTrackbarPos('B', 'imag'), cv.getTrackbarPos('G', 'imag'), cv.getTrackbarPos('R', 'imag')]
cv.setTrackbarPos(switch, 'imag', 0) # 通过set轨迹(跟踪)栏位置,实现为1刷新后,及时回到0位置
cv.destroyAllWindows()
效果演示:将上述小训练代码整合后可直接运行。首先使用鼠标随意书写“开心”二字。

随后点击特定区域(可能需要先选中轨迹栏,再点击以执行变化操作)。

此时即可实现画布刷新效果。

继续绘制其他内容进行测试。

至此,小练习结束。既练习了将鼠标事件作为画笔的功能,也实现了轨迹栏的设置与读取,并完成了画板刷新的功能。
总结
本文介绍了如何使用Python OpenCV通过轨迹栏实现更改整张图像背景颜色的方法。更多相关OpenCV更改图像背景颜色的内容,请搜索本站以往文章或继续浏览后续相关文章。希望大家多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









