直接上代碼
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.明確事件的內容