滚动条(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()

用滚动条控制实心或者虚心的矩形


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenCV61.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 26 日
如果觉得我的文章对你有用,请随意赞赏