Opencv学习笔记————处理鼠标事件

直接上代码

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.明确事件的内容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章