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

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

文章目录

    • 19.3 滚动条
        • 19.3.1 用滚动条实现调色板
        • 19.3.2 用滚动条控制阈值处理参数
        • 19.3.3 用滚动条作为开关

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)&0xFFif 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=xp1y=yp2x=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)&0xFFg=cv2.getTrackbarPos('R','image')if g==0:thickness=-1else:thickness=2        if k==27:break   
cv2.destroyAllWindows()

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

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部