OpenCV_Python官方文档5——调节滑动条来设定画板颜色

版权声明:本文为博主原创文章,欢迎转载,但未经作者同意必须保留此段声明,版权所有翻版必究。 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的颜色
  • 当滑动滑动条时,窗口颜色实时发生改变,默认窗口为黑色。

主要函数

  1. cv2.createTrackbar()
  • 滑动条的名字
  • 滑动条所处窗口的名字
  • 滑动条默认的位置
  • 滑动条上能调节的最大值(0~count)
  • 调节滑动条时调用的回调函数,每次滑动都会调用回调函数,回调函数通常都会含有一个默认参数,就是滑动条的位置。
  1. 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()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sinat_38814578/article/details/83065128