Python OpenCV 使用轨迹栏动态修改图像背景色

小石头
小石头
发布时间:2026-10-13 | 4人浏览过
原创

本文详解如何利用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更改图像背景颜色的内容,请搜索本站以往文章或继续浏览后续相关文章。希望大家多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表