首页 > 技术知识 > 正文

一、学习目标

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

上一节

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

效果如下:

[python opencv 计算机视觉零基础到实战] 十九、使用拖动条动态颜色绘制内容也可以不使用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()
<

结果如下:

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

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

结果如下:

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

三、总结

了解拖动条的使用,createTrackbar创建滑动条,getTrackbarPos读取滑动条值 编写了一个可控制颜色的绘图板

猜你喜欢