版权声明:本文为博主原创文章,欢迎转载,但未经作者同意必须保留此段声明,版权所有翻版必究。 https://blog.csdn.net/sinat_38814578/article/details/83065128
OpenCV-Python Tutorials
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html
通过调节滑动条来设定画板颜色
- 窗口显示颜色,三个滑动条来设置RGB的颜色
- 当滑动滑动条时,窗口颜色实时发生改变,默认窗口为黑色。
主要函数
cv2.createTrackbar()
- 滑动条的名字
- 滑动条所处窗口的名字
- 滑动条默认的位置
- 滑动条上能调节的最大值(0~count)
- 调节滑动条时调用的回调函数,每次滑动都会调用回调函数,回调函数通常都会含有一个默认参数,就是滑动条的位置。
cv2.getTrackbarPos(trackbarname, winname)
:获取滑动条当前的位置
滑动条的另一个应用就是用作转换按钮,OpenCV默认情况是不带有按钮函数的,这里以滑动条代替,需要先创建一个转换按钮,只有当转换按钮指向ON时滑动条才有用。
import cv2
import numpy as np
#回调函数
def nothing(x):
pass
#创建一个背景
img = np.zeros((300,512,3),np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)
switch = '0 : OFF \n1 : ON' #转换按钮
cv2.createTrackbar(switch,'image',0,1,nothing)
while(1):
cv2.imshow('image',img)
k = cv2.waitKey(1) & 0xFF
if k == ord('q'): #按q键退出
break
#获得滑动条的value值
r = cv2.getTrackbarPos('R','image')
g = cv2.getTrackbarPos('G','image')
b = cv2.getTrackbarPos('B','image')
s = cv2.getTrackbarPos(switch,'image')
if s == 0:
img[:] = 0 #转换按钮关闭时,窗口为黑色
else:
img[:] = [b,g,r] #按钮开启后,滑动条开始起作用
cv2.destroyAllWindows()
获取画笔颜色后,鼠标按下开始画图,默认是绘制矩形,如果按了’m’键,则切换是笔刷模式,半径可以根据滑动条radius自己调节,如果再按’m’键,则切换会矩形。双击左键绘制圆。添加了橡皮擦功能
import cv2
import numpy as np
#回调函数
def nothing(x):
pass
drawing = False
mode = True
ix,iy = -1,-1
#鼠标响应函数
def OnMouseAction(event,x,y,flags,param):
global ix,iy,drawing,mode
r = cv2.getTrackbarPos('R','image')
g = cv2.getTrackbarPos('G','image')
b = cv2.getTrackbarPos('B','image')
s = cv2.getTrackbarPos('eraser','image')
rr = cv2.getTrackbarPos('radius','image') #圆的半径
if s == 1: #橡皮擦eraser
color = (255,255,255) #当s拖动到1时,开启橡皮擦功能
else:
color = (b,g,r) #s关闭,即为0时,关闭橡皮擦功能,滑动条开始起作用
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
if drawing == True:
if mode == True:
cv2.rectangle(img,(ix,iy),(x,y),color,-1)#单击左键拖动鼠标绘制矩形
else:
cv2.circle(img,(x,y),rr,color,-1) #单击左键拖动鼠标开启笔刷模式
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
elif event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),rr,color,-1) #双击左键画圆
img = np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
img[:] = 255 #画板颜色设置为白色
cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)
cv2.createTrackbar('eraser','image',0,1,nothing)
cv2.createTrackbar('radius','image',1,50,nothing)
cv2.setMouseCallback('image',OnMouseAction)
while(1):
cv2.imshow('image',img)
k = cv2.waitKey(1) & 0xFF
if k == ord('q'): #按q键退出
break
elif k == ord('m'):
mode = not mode
cv2.destroyAllWindows()