[python opencv 计算机视觉零基础到实战] 十九、使用拖动条动态颜色绘制内容
一、学习目标
- 了解拖动条的使用
- 编写一个可控制颜色的绘图板
上一节
[python opencv 计算机视觉零基础到实战] 十九、简易绘画板制作
二、使用拖动条动态颜色绘制内容
2.1 了解滑动条的使用
在OpenCV中提供了滑动条作为动态参数的调节工具,它可以依附窗口存在。使用的方法是createTrackbar。createTrackbar接收5个参数,函数原型如下:
cv2.createTrackbar(trackbarName, windowName, value, count, onChange)
其中:
- trackbarname为当前滑动条的名称
- winname为即将要依附到的窗口上的名称
- value为滑动条的默认值
- count为活动条的最大选择值
- onChange为每次滑动的时候需要执行的函数
接下来我们创建三个通道的动态选择滑动条,然后动态更改图片的值。首先我们可以创建一张图片:
import numpy as np
import cv2 as cv
img = np.zeros((500,500,3), np.uint8)
cv.namedWindow('image')
随后可以创建三个滑动条,分别是选择r,g,b三种颜色的值,我们首先查看单个的r通道值滑动条的创建:
cv.createTrackbar('R','image',0,255,funcTrackbar)
funcTrackbar是拖动滑动条后所选择的执行函数,也是跟事件类似,拖动滑动条则会执行该函数,这个函数接收一个参数x,为拖动的值。其中第一个参数R为滑动条的名称,image为需要绑定到的窗口名称,0和255表示最高值与最低值。funcTrackbar函数如下:
def funcTrackbar(x):
print('Trackbar move')
接着我们创建其它两个通道的滑动条,并且都依附于image窗口,以及funcTrackbar为响应函数:
cv.createTrackbar('G','image',0,255,funcTrackbar)
cv.createTrackbar('B','image',0,255,funcTrackbar)
随后使用一个while循环:
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == 27:
break
接下来使用getTrackbarPos函数对滑动条的值进行读取,getTrackbarPos如下:
getTrackbarPos(trackbarname, winname)
第一个参数是需要获取到值的滑动条名称,第二个是所依附的窗口名称。由于我们需要取3个值,所以我们需要3个getTrackbarPos函数分别获取到r、g、b三个通道的值:
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
随后显示到图片上即可:
img[:] = [b,g,r]
完整代码如下:
import numpy as np
import cv2 as cv
def funcTrackbar(x):
print('Trackbar move')
img = np.zeros((500,500,3), np.uint8)
cv.namedWindow('image')
cv.createTrackbar('R','image',0,255,funcTrackbar)
cv.createTrackbar('G','image',0,255,funcTrackbar)
cv.createTrackbar('B','image',0,255,funcTrackbar)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == 27:
break
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
img[:] = [b,g,r]
cv.destroyAllWindows()
效果如下:
也可以不使用getTrackbarPos方法,直接使用全局变量也可以获取到rgb值,完整代码如下:
import numpy as np
import cv2 as cv
r,g,b=0,0,0
def r_funcTrackbar(x):
global r
print('r Trackbar move',x)
r=x
def g_funcTrackbar(x):
global g
print('g Trackbar move',x)
g=x
def b_funcTrackbar(x):
global b
print('b Trackbar move',x)
b=x
img = np.zeros((500,500,3), np.uint8)
cv.namedWindow('image')
cv.createTrackbar('R','image',0,255,r_funcTrackbar)
cv.createTrackbar('G','image',0,255,g_funcTrackbar)
cv.createTrackbar('B','image',0,255,b_funcTrackbar)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == 27:
break
print(r,g,b)
img[:] = [b,g,r]
cv.destroyAllWindows()
结果如下:
2.2 让颜色可以丰富起来
前一节中我们学习了如何使用鼠标事件绘制内容,这一节我们将两者结合起来绘制出多种颜色的图案。首先引入上一节中的draw函数以及3个全局变量,代码解释请看上一节内容:
drawing=False
sx,sy=0,0
def draw(event,x,y,flags,param):
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
global sx,sy,drawing
if event==cv.EVENT_LBUTTONDOWN:
drawing=True
sx,sy=x,y
elif event==cv.EVENT_MOUSEMOVE and flags==cv.EVENT_FLAG_LBUTTON:
if drawing==True:
cv.rectangle(img,(sx,sy),(x,y),(b,g,r),-1)
elif event==cv.EVENT_LBUTTONUP:
drawing==False
以上代码中有细微改动,在这里使用了:
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
获取到每个滑动条的内容。并且在绘制矩形时给予到颜色参数:
cv.rectangle(img,(sx,sy),(x,y),(b,g,r),-1)
随后对窗口进行绑定即可:
cv.setMouseCallback('image',draw)
cv.createTrackbar('R','image',0,255,funcTrackbar)
cv.createTrackbar('G','image',0,255,funcTrackbar)
cv.createTrackbar('B','image',0,255,funcTrackbar)
完整代码如下:
import numpy as np
import cv2 as cv
drawing=False
sx,sy=0,0
def draw(event,x,y,flags,param):
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
global sx,sy,drawing
if event==cv.EVENT_LBUTTONDOWN:
drawing=True
sx,sy=x,y
elif event==cv.EVENT_MOUSEMOVE and flags==cv.EVENT_FLAG_LBUTTON:
if drawing==True:
cv.rectangle(img,(sx,sy),(x,y),(b,g,r),-1)
elif event==cv.EVENT_LBUTTONUP:
drawing==False
def funcTrackbar(x):
print('Trackbar move')
img=np.zeros((600,600,3),np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw)
cv.createTrackbar('R','image',0,255,funcTrackbar)
cv.createTrackbar('G','image',0,255,funcTrackbar)
cv.createTrackbar('B','image',0,255,funcTrackbar)
while(1):
cv.imshow('image',img)
if cv.waitKey(20)&0xFF==27:
break
cv.destroyAllWindows()
结果如下:
三、总结
- 了解拖动条的使用,createTrackbar创建滑动条,getTrackbarPos读取滑动条值
- 编写了一个可控制颜色的绘图板
- 分享
- 举报
-
浏览量:5456次2021-01-05 22:14:42
-
浏览量:4610次2021-01-14 01:47:31
-
浏览量:5238次2020-12-29 19:37:20
-
2020-12-14 18:16:24
-
浏览量:4966次2021-01-11 15:33:50
-
浏览量:5641次2020-12-21 16:50:21
-
浏览量:6770次2021-01-05 18:32:12
-
浏览量:7293次2020-12-21 20:12:30
-
浏览量:5679次2021-01-03 01:24:13
-
2021-01-12 21:31:51
-
浏览量:4428次2021-01-08 01:04:31
-
浏览量:5237次2021-01-12 23:46:34
-
浏览量:5630次2021-01-02 22:50:35
-
浏览量:6081次2020-12-29 14:13:00
-
浏览量:4775次2021-01-19 16:45:32
-
浏览量:8715次2020-12-16 22:21:43
-
浏览量:9384次2020-12-18 22:21:10
-
浏览量:6185次2020-12-25 23:18:24
-
2021-01-19 23:49:13
-
26篇
- 华为新推SuperCharge快充电器 可兼容海思协议
- [python opencv 计算机视觉零基础到实战]二十一、仿射变换与图片融合
- 又双叒发现了!OpenCV4中boxPoints函数在Python与C++中不一致问题
- 华为恐慌!急单满天飞,芯片全球扫货!
- AI社交距离检测器:利用Yolo目标检测改进人的检测
- 海思H264录像注意事项
- 分享海思Hi3559A 开发板 SDK开发包
- 美国封锁之下,华为员工已升至19.4万人
- OpenCV移植海思Hi3516DV300,编译与进一步裁剪
- 海思3531A解码this is a field stream and vdec do not support! chn 3
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
1_bit
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明