[python opencv 计算机视觉零基础到实战] 十九、使用拖动条动态颜色绘制内容

1_bit 2021-01-15 12:22:23 4188

一、学习目标

  1. 了解拖动条的使用
  2. 编写一个可控制颜色的绘图板

上一节

[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()

结果如下:

三、总结

  1. 了解拖动条的使用,createTrackbar创建滑动条,getTrackbarPos读取滑动条值
  2. 编写了一个可控制颜色的绘图板
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
1_bit
红包 88 9 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
1_bit
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区