先展示一下效果:
英文输入法: y 代表绘制圆形; f 代表绘制方形; l 代表绘制直线(line); c 代表清空画布
然后直接上代码:
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
img = np.zeros((400,900,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw_circle) # 将鼠标绘图事件与画布绑定在一起
drawing = False
mode = 'f' # f 表示方形 y 表示圆形 l 表示直线
color = (255,255,0)
ix, iy = -1, -1
def draw_circle(event, x, y, flags, param):
global ix, iy, drawing, mode, color
if event == cv.EVENT_LBUTTONDOWN: # 鼠标左键按下 L:left BUTTON: 点击 DOWN: 按下
drawing = True
ix, iy = x, y
elif event == cv.EVENT_MOUSEMOVE: # 鼠标移动
if drawing == True:
if mode == 'f':
cv.rectangle(img, (ix,iy), (x,y), color, -1)
elif mode == 'y':
cv.circle(img, (x,y), 20, color, -1)
elif mode == 'l':
cv.line(img, (ix,iy), (x,y), color, 10)
elif event == cv.EVENT_LBUTTONUP: # 鼠标左键松开
drawing = False
if mode == 'f':
cv.rectangle(img, (ix,iy), (x,y), color, -1)
elif mode == 'y':
cv.circle(img, (x,y), 20, color, -1)
elif mode == 'l':
cv.line(img, (ix,iy), (x,y), color, 10)
# 创建滑动条
cv.createTrackbar('R','image',0,255,nothing)
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == ord('f'):
mode = 'f'
elif k == ord('y'):
mode = 'y'
elif k == ord('l'):
mode = 'l'
elif k == ord('c'):
img[:] = 0
elif k == 27:
break
# 获取滑动条的位置(既 RGB 每个滑动条的值)
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
color = (b,g,r)
cv.destroyAllWindows()