一、学习目标
了解拖动条的使用 编写一个可控制颜色的绘图板上一节
[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读取滑动条值 编写了一个可控制颜色的绘图板免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:[python opencv 计算机视觉零基础到实战] 十九、使用拖动条动态颜色绘制内容 https://www.yhzz.com.cn/a/13194.html