【基础】滚动条
滚动条(Trackbar)在OpenCV中是非常方便且常用的交互工具,它依附于特定的窗口而存在。通过调节滚动条能够设置、获取指定范围内的特定值。
在OpenCV中,函数cv2.createTrackbar()用来定义滚动条,其语法格式为:
cv2.createTrackbar(trackbarName, windowName, value, count, onChange)
● trackbarname为滚动条的名称。
● winname为滚动条所依附窗口的名称。
● value为初始值,该值决定滚动条中滑块的位置。
● count为滚动条的最大值。通常情况下,其最小值是0。
● onChange为回调函数。一般情况下,将滚动条改变后要实现的操作写在回调函数内。
函数cv2.createTrackbar()用于生成一个滚动条。拖动滚动条,就可以设置滚动条的值,并让滚动条返回对应的值。滚动条的值可以通过函数cv2.getTrackbarPos()获取,其语法格式为:
retval = cv2.getTrackbarPos(trackbarname, winname)
● retval为返回值,获取函数cv2.createTrackbar()生成的滚动条的值。
● trackbarname为滚动条的名称。
● winname为滚动条所依附的窗口的名称。
案例一:用滚动条实现调色板
在RGB颜色空间中,任何颜色都是由红(R)、绿(G)、蓝(B)三种颜色构成的,每一种颜色分量的区间是[0, 255]。所以我们可以用函数cv2.createTrackbar()和函数cv2.getTrackbarPos()设计一个模拟调色板:在窗体中,有三个滚动条分别用来设置R、G、B的值,调色板会根据当前的R、G、B值实时显示其所对应的颜色。
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, 700, 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 True:
cv2.imshow('image', img)
if cv2.waitKey(1) & 0xFF == 27: # ESC 退出
break
cv2.destroyAllWindows()
运行程序,在窗体对象内,分别调整R、G、B三个滚动条,可以得到运行结果如下图所示:



案例二:用滚动条控制阈值处理参数
设计一个滚动条交互程序,通过滚动条控制函数cv2.threshold()中的阈值和模式。
复习:openCV提供cv2.threshold()函数用于图像阈值化处理,其函数格式如下:
retval, dst = cv2.threshold(src, thresh, maxval, type[, dst])
retval:返回的阈值。dst:阈值分割结果,与原始图像具有相同的大小和类型。src:要进行阈值分割的图像。thresh:设定的阈值。maxval:当像素值超过了阈值(或者小于阈值,根据type来决定)所赋予的值type:代表阈值分割的类型,常用的有:cv2.THRESH_BINARYcv2.THRESH_BINARY_INVcv2.THRESH_TRUNCcv2.THRESH_TOZEROcv2.THRESH_TOZERO_INV
import cv2
def onValueChanged(a):
Value = cv2.getTrackbarPos(tValue, win_name)
ret, dst = cv2.threshold(img, Value, 255, cv2.THRESH_BINARY)
cv2.imshow(win_name, dst)
img = cv2.imread('lena.jpg', 0)
win_name = 'demo'
cv2.namedWindow(win_name)
cv2.imshow(win_name, img)
# 创建滚动条
tValue = "Value"
cv2.createTrackbar(tValue, win_name, 0, 255, onValueChanged)
if cv2.waitKey(0) == 27: # ESC
cv2.destroyAllWindows()

案例三:用滚动条控制均值滤波滤波核大小
复习:在openCV中,实现均值滤波的函数是cv2.blur(),语法格式如下:
dst = cv2.blur(src, ksize[, dst[, anchor[, borderType]]])
dst:均值滤波操作后的结果图像src: 输入图像,即需要处理的图像ksize:滤波核的大小dst,anchor,borderType:可选参数。
import cv2
def onValueChanged(a):
Value = cv2.getTrackbarPos(kValue, win_name)
ksize = (Value, Value)
mean = cv2.blur(img, ksize)
cv2.imshow(win_name, mean)
img = cv2.imread('lena.jpg', 0)
win_name = 'demo'
cv2.namedWindow(win_name)
cv2.imshow(win_name, img)
# 创建滚动条
kValue = "Value"
cv2.createTrackbar(kValue, win_name, 1, 10, onValueChanged)
if cv2.waitKey(0) == 27: # ESC
cv2.destroyAllWindows()
