python运用opencv和回调函数制作一个rgb画板

自己写的一个回调函数无法实现rgb颜色调整,希望附上过程,必给采纳

img

在函数nothing的开头定义一下全局变量,加上:
global brush_color, brush_color, drawing
改成这样:

import cv2
import numpy as np

def nothing(x):
    global brush_color, brush_color, drawing
    cv2.imshow('painting', img)
    r = cv2.getTrackbarPos('r', 'painting')
    g = cv2.getTrackbarPos('g', 'painting')
    b = cv2.getTrackbarPos('b', 'painting')

    brush_color = (b, g, r)
    brush_size = cv2.getTrackbarPos('brush size', 'painting')


def mouse_event(event, x, y, flags, param):
    '''
    ### 鼠标回调函数
    '''
    global brush_size, brush_color, drawing

    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing:
            cv2.circle(img, (x, y), brush_size, brush_color, -1)
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        cv2.circle(img, (x, y), brush_size, brush_color, -1)


img = np.zeros((300, 512, 3), np.uint8)
img[:] = (255, 255, 255)  # 定义画板为白色
cv2.namedWindow('painting')
# 定义默认的笔刷尺寸和颜色
brush_size, brush_color = 8, (0, 0, 0)
drawing = False
# 创建rgb三个滑动条
cv2.createTrackbar('r', 'painting', 0, 255, nothing)
cv2.createTrackbar('g', 'painting', 0, 255, nothing)
cv2.createTrackbar('b', 'painting', 0, 255, nothing)
# 创建笔刷大小滑动条
cv2.createTrackbar('brush size', 'painting', 8, 15, nothing)
# 定义鼠标回调函数
cv2.setMouseCallback('painting', mouse_event)

cv2.waitKey()
cv2.destroyAllWindows()

img

如有帮助,请点采纳。

你写的是实时更新的吗?或者你调整之后你试试再绘图试试,看看rgb值是否调整

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

上面的例子,有几个问题:

  1. 显式绘图内容的窗口没有用img初始化
  2. 滑块回调函数没有声明全局变量brush_size和brush_color
  3. 鼠标回调函数没有实时刷新,却把刷新放到了滑块回调函数中

稍微修改一下,效果还不错。不过,要是我写,就不会用circle而是line函数,可以保证线的连续性。

import cv2
import numpy as np
 
def nothing(x):
    global brush_size, brush_color
    
    r = cv2.getTrackbarPos('r', 'painting')
    g = cv2.getTrackbarPos('g', 'painting')
    b = cv2.getTrackbarPos('b', 'painting')
 
    brush_color = (b, g, r)
    brush_size = cv2.getTrackbarPos('brush size', 'painting')
 
 
def mouse_event(event, x, y, flags, param):
    global brush_size, brush_color, drawing
 
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
    elif event == cv2.EVENT_MOUSEMOVE and drawing:
        cv2.circle(img, (x, y), brush_size, brush_color, -1)
        cv2.imshow('painting', img)
 
 
img = np.zeros((300, 512, 3), np.uint8)
img[:] = (255, 255, 255)  # 定义画板为白色
cv2.namedWindow('painting')
cv2.imshow('painting', img)
 
# 定义默认的笔刷尺寸和颜色
brush_size, brush_color = 8, (0, 0, 0)
drawing = False
 
# 创建rgb三个滑动条
cv2.createTrackbar('r', 'painting', 0, 255, nothing)
cv2.createTrackbar('g', 'painting', 0, 255, nothing)
cv2.createTrackbar('b', 'painting', 0, 255, nothing)

# 创建笔刷大小滑动条
cv2.createTrackbar('brush size', 'painting', 8, 15, nothing)

# 定义鼠标回调函数
cv2.setMouseCallback('painting', mouse_event)
 
cv2.waitKey()
cv2.destroyAllWindows()

img