OpenCV鼠标事件

鼠标事件

鼠标事件

# 使用鼠标作为画笔
# 列出cv中所有含'EVENT'的函数-----鼠标事件
events = [i for i in dir(cv) if 'EVENT' in i]
print(events)

将窗口与鼠标事件绑定

cv2.setMouseCallback(windowName, MouseCallback, param=None) 

# windowName:窗口名称

# MouseCallback:鼠标响应回调函数

# param:响应函数传递的的参数

鼠标响应回调函数

# 鼠标回调函数
MouseCallback (event, x, y, flags, *userdata)
'''

event:一个MouseEventTypes 常


x:鼠标的x坐标
y:鼠标的y坐标

flags:一个MouseEventFlags常量

userdata:可选参数

MouseEventFlags :
  cv.EVENT_FLAG_LBUTTON = 1, 左键拖拽
  cv.EVENT_FLAG_RBUTTON = 2, 右键拖拽
  cv.EVENT_FLAG_MBUTTON = 4, 中键不放
  cv.EVENT_FLAG_CTRLKEY = 8,按住ctrl不放 
  cv.EVENT_FLAG_SHIFTKEY = 16, 按住shift不放
  cv.EVENT_FLAG_ALTKEY = 32 ,按住alt不放
  

 cv.MouseEventTypes :
  cv.EVENT_MOUSEMOVE = 0, 鼠标移动
  cv.EVENT_LBUTTONDOWN = 1, 左键按下
  cv.EVENT_RBUTTONDOWN = 2, 右键按下
  cv.EVENT_MBUTTONDOWN = 3, 中键按下
  cv.EVENT_LBUTTONUP = 4, 左键释放
  cv.EVENT_RBUTTONUP = 5, 右键释放
  cv.EVENT_MBUTTONUP = 6, 中键释放
  cv.EVENT_LBUTTONDBLCLK = 7, 左键双击
  cv.EVENT_RBUTTONDBLCLK = 8, 右键双击
  cv.EVENT_MBUTTONDBLCLK = 9, 中健双击
  cv.EVENT_MOUSEWHEEL = 10, 滚轮滑动
  cv.EVENT_MOUSEHWHEEL = 11 横向滚轮滑动
'''

实例

在鼠标双击的地方画一个圆

def test5():
    # 使用鼠标作为画笔
    # 列出cv中所有含'EVENT'的函数
    events = [i for i in dir(cv) if 'EVENT' in i]
    print(events)

    # 鼠标回调函数,在鼠标双击的地方画一个圆
    def draw_circle(event, x, y, flags, param):
        if event == cv.EVENT_LBUTTONDBLCLK:
            cv.circle(img, (x, y), 100, (255, 0, 0), -1)

    # 创建一个黑色的图像,一个窗口,并绑定到窗口的功能
    img = np.zeros((512, 512, 3), np.uint8)
    cv.namedWindow('image')
    cv.setMouseCallback('image', draw_circle)  # 将窗口与鼠标事件绑定
    while 1:
        cv.imshow('image', img)
        if cv.waitKey(20) & 0xFF == 27:  # 计算机中整数以补码形式存储,ESC的ASCLL码值为27
            break
    cv.destroyAllWindows()


if __name__ == '__main__':
    test5()

在这里插入图片描述
按下鼠标左键后,再按m画圆形;按下鼠标左键后,按下r画矩形

drawing = False  # 如果按下鼠标,则为真
mode = True  # 如果为真,绘制矩形。按 m 键可以切换到曲线
ix, iy = -1, -1


# 鼠标回调函数
def draw_circle01(event, x, y, flags, param):
    global ix, iy, drawing, mode
    if cv.waitKey(1) == ord('m'):  # 按下鼠标左键后,再按m画圆形
        mode = False
    if cv.waitKey(1) == ord('r'):  # 按下鼠标左键后,按下r画矩形
        mode = True
    if event == cv.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y
    elif event == cv.EVENT_MOUSEMOVE:
        if drawing:
            if mode:
                cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
            else:
                cv.circle(img, (x, y), 5, (0, 0, 255), -1)
    elif event == cv.EVENT_LBUTTONUP:
        drawing = False
        if mode:
            cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
        else:
            cv.circle(img, (x, y), 5, (0, 0, 255), -1)


img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw_circle01)  # 将窗口与鼠标事件绑定
while 1:
    cv.imshow('image', img)
    if cv.waitKey(20) & 0xFF == 27:  # 计算机中整数以补码形式存储,ESC的ASCLL码值为27
        break
cv.destroyAllWindows()

学习参考链接来自少灬儿郎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值