直接上代码
import cv2
import numpy as np
# 当鼠标按下时变为 True
drawing = False
# 如果 mode 为 true 绘制矩形。按下 'm' 变成绘制曲线。
mode = True
ix, iy = -1, -1
flag = 0
# 创建画布
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
# 定义事件处理函数
def draw_circle(event, x, y, flags, param):
global ix, iy, drawing, mode
# 当按下左键按下是记录初始位置坐标
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
# 当鼠标左键按下并移动是绘制图形。 event 可以查看移动 flag 查看是否按下
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
if drawing:
if mode:
# 矩形轮廓(无填充)
cv2.rectangle(img, (ix, iy), (ix+10, iy+10), (0, 250, 0), 1)
# cv2.rectangle(img, (ix, iy), (x, y), (0, 250, 0), -1)实心图形
else:
cv2.circle(img, (x, y), 3, (0, 255, 255), -1)
elif event == cv2.EVENT_LBUTTONUP:
# 松开停止绘画
drawing = False
# 绑定事件处理函数
cv2.setMouseCallback('image', draw_circle)
while 1:
cv2.imshow('image', img)
flag = cv2.waitKey(1) & 0xFF
if flag == ord('q'):
break
elif flag == ord('m'):
# 取反操作
mode = not mode
cv2.destroyAllWindows()
注意事项:
1.所有的鼠标事件的回调函数都有统一的格式,不需要修改
2.需要绑定事件处理函数
3.明确事件的内容