滚动条(Trackbar)在 OpenCV 中是非常方便的交互工具,它依附于特定的窗口而存在。通过调节滚动条能够设置、获取指定范围内的特定值。
基本语法
OpenCV 中,函数 cv2.createTrackbar()用来定义滚动条,其语法格式为:
cv2.createTrackbar(trackbarname, winname, value, count, onChange)
其中:
- trackbarname 为滚动条的名称。
- winname 为滚动条所依附窗口的名称。
- value 为初始值,该值决定滚动条中滑块的位置。
- count 为滚动条的最大值。通常情况下, 其最小值是 0。
- onChange 为回调函数。一般情况下,将滚动条改变后要实现的操作写在回调函数内。
函数 cv2.createTrackbar()用于生成一个滚动条。拖动滚动条,就可以设置滚动条的值,并让滚动条返回对应的值。
滚动条的值可以通过函数 cv2.getTrackbarPos()获取,其语法格式为:
retval=getTrackbarPos( trackbarname,winname )
- retval 为返回值,获取函数 cv2.createTrackbar()生成的滚动条的值。
- trackbarname 为滚动条的名称。
- winname 为滚动条所依附的窗口的名称。
用滚动条实现调色板
在 RGB 颜色空间中,任何颜色都是由红(R)、绿(G)、蓝(B)三种颜色构成的,每一种颜色分量的区间是[0, 255]。
下面使用函数 cv2.createTrackbar()和函数 cv2.getTrackbarPos()设计一个模拟调色板。
import cv2
import numpy as np
def changeColor(x):
r = cv2.getTrackbarPos('R','image')
g = cv2.getTrackbarPos('G','image')
b = cv2.getTrackbarPos('B','image')
img[:] = [b,g,r]
img = np.zeros((100,500,3),np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R','image',0,255,changeColor)
cv2.createTrackbar('G','image',0,255,changeColor)
cv2.createTrackbar('B','image',0,255,changeColor)
while 1:
cv2.imshow('image',img)
k = cv2.waitKey(1)
if k == ord("q") or k == 27:
break
cv2.waitKey()
cv2.destroyAllWindows()
运行效果:
用滚动条控制阈值处理参数
实现一个滚动条交互程序,通过滚动条控制函数 cv2.threshold()中的阈值和模式
cv2.threshold()的语法格式:
retval, dst=cv2.threshold(src, thresh, maxval, type)
- src:源图像。
- thresh:阈值。
- maxval: 当 type 参数的值为 THRESH_BINARY 或者 THRESH_BINARY_INV 时,需要设定的最大值。
- type:阈值处理的方式(类型)。
- dst:处理结果。
- retval: 返回的阈值。
import cv2
Type = 0 #阈值处理方式
Value = 0 #使用阈值
def onType(a):
Type = cv2.getTrackbarPos(tType,windowName)
Value = cv2.getTrackbarPos(tValue,windowName)
ret,dst = cv2.threshold(o,Value,255,Type) # 用type值0-4来表示不同的阈值处理方法
cv2.imshow(windowName,dst)
def onValue(a):
Type = cv2.getTrackbarPos(tType,windowName)
Value = cv2.getTrackbarPos(tValue,windowName)
ret,dst = cv2.threshold(o,Value,255,Type)
cv2.imshow(windowName,dst)
o = cv2.imread('hongmao.jpg',0)
windowName='demo'
cv2.namedWindow(windowName)
cv2.imshow(windowName,o)
# 创建两个滚动条
tType='Type'
tValue='Value'
cv2.createTrackbar(tType,windowName,0,4,onType)
cv2.createTrackbar(tValue,windowName,0,255,onValue)
if cv2.waitKey(1) == 27 or cv2.waitKey(1)==ord('q'):
cv2.destroyAllWindows()
cv2.waitKey()
用滚动条作为开关
有时也可将滚动条作为“开关”使用。此时,滚动条只有两种值“0”和“1”,当滚动条的值为 0 时,代表 False;当滚动条的值为 1 时,代表 True。
除了表示逻辑关系外,也可以让滚动条的 0 和 1 分别表示其他任意形式的两种不同状态。
import cv2
import numpy as np
d = 600
global thickness #全局变量
thickness = -1
def fill_func(x):
pass
def draw(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDBLCLK:
p1x = x
p1y = y
p2x = np.random.randint(1,d-50)
p2y = np.random.randint(1,d-50)
color = np.random.randint(0,high=256,size=(3,)).tolist()
cv2.rectangle(img,(p1x,p1y),(p2x,p2y),color,thickness)
img = np.ones((d,d,3),np.uint8)*255
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw) # 通过“鼠标交互”来进行绘图
# 创建 滚动条
# 滚动条这里仅仅是提供一个“开关”,二值的选择
cv2.createTrackbar('R','image',0,1,fill_func) # 滚动条的回调函数是空,什么都不做,
while 1:
cv2.imshow('image',img)
k = cv2.waitKey(10)
# 滚动条的值可以通过函数 cv2.getTrackbarPos()获取
g = cv2.getTrackbarPos('R','image')
# 如果 得到 滚动条的值是0,那么就是实心, thickness=-1
if g==0:
thickness=-1
# 否则, thickness=2
else:
thickness = 2
if k == 27:
break
cv2.waitKey()
cv2.destroyAllWindows()