win10+Python3.7.3+OpenCV3.4.1入门学习(十九 绘图及交互)————19.3 滚动条

Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm

19.3 滚动条

滚动条(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为滚动条所依附的窗口的名称。

19.3.1 用滚动条实现调色板

在RGB颜色空间中,任何颜色都是由红(R)、绿(G)、蓝(B)三种颜色构成的,每一种颜色分量的区间是[0, 255]。本节用函数cv2.createTrackbar()和函数cv2.getTrackbarPos()设计一个模拟调色板:在窗体中,有三个滚动条分别用来设置R、G、B的值,调色板会根据当前的R、G、B值实时显示其所对应的颜色。
eg1:设计一个滚动条交互程序,通过滚动条模拟调色板效果。
代码如下:

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',100,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)&0xFF
    if k==27:
        break   
cv2.destroyAllWindows()

运行程序,在窗体对象内,分别调整R、G、B三个滚动条,可以得到运行结果如下图所示。

在这里插入图片描述

19.3.2 用滚动条控制阈值处理参数

本节设计一个程序,让不同的滚动条对应不同的响应函数,使滚动条具有更强的交互性。
eg2:设计一个滚动条交互程序,通过滚动条控制函数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) 
    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("lena512.bmp",0)
windowName = "Demo19.13"  #窗体名
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(0) == 27:  
    cv2.destroyAllWindows()

运行程序,在窗体对象内,同时显示控制阈值和阈值处理方式的两个滚动条。调整滚动条可以分别控制阈值处理时所使用的阈值和阈值处理方式,运行结果如下图所示。
在这里插入图片描述

19.3.3 用滚动条作为开关

有时也可将滚动条作为“开关”使用。此时,滚动条只有两种值“0”和“1”,当滚动条的值为0时,代表False;当滚动条的值为1时,代表True。
除了表示逻辑关系外,也可以让滚动条的0和1分别表示其他任意形式的两种不同状态。
eg3:设计一个滚动条交互程序,用滚动条控制绘制的矩形是实心的还是空心的。
代码如下:

import cv2
import numpy as np
d=400
global thickness
thickness=-1
def fill(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)
while(1):
    cv2.imshow('image',img)
    k=cv2.waitKey(1)&0xFF
    g=cv2.getTrackbarPos('R','image')
    if g==0:
        thickness=-1
    else:
        thickness=2        
    if k==27:
        break   
cv2.destroyAllWindows()

运行程序,调整滚动条,绘制不同形式的矩形,得到如下图所示的结果。

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值