OpenCV鼠标事件

在图像算法开发过程中,如果考虑引入Gui,不需要Qt 、PySide等复杂的插件和优秀的界面模版的话,OpenCV会是一个不错的选择,十几行代码就可以搞定这些交互。这篇博客简单介绍Python OpenCV的鼠标事件交互。

回调函数

首先添加回调函数,就是鼠标操作时的响应

def OnMouse(event,x,y,flags,param):

我们可以通过setMouseCallback来设置对应窗口的回调函数,我们在对应窗口上移动鼠标时就会触发回调函数的调用

cv2.setMouseCallback(‘image’,OnMouse)

event参数,回调函数的事件有下面几个

EVENT_MOUSEMOVE 0 #滑动
EVENT_LBUTTONDOWN 1 #左键点击
EVENT_RBUTTONDOWN 2 #右键点击
EVENT_MBUTTONDOWN 3 #中键点击
EVENT_LBUTTONUP 4 #左键放开
EVENT_RBUTTONUP 5 #右键放开
EVENT_MBUTTONUP 6 #中键放开
EVENT_LBUTTONDBLCLK 7 #左键双击
EVENT_RBUTTONDBLCLK 8 #右键双击
EVENT_MBUTTONDBLCLK 9 #中键双击

x,y 代表鼠标位于窗口的(x,y)坐标位置

flags 是代表鼠标拖拽的事件,以及键盘鼠标联合事件

EVENT_FLAG_LBUTTON 1 #左鍵拖曳
EVENT_FLAG_RBUTTON 2 #右鍵拖曳
EVENT_FLAG_MBUTTON 4 #中鍵拖曳
EVENT_FLAG_CTRLKEY 8 #(8~15)按Ctrl不放事件
EVENT_FLAG_SHIFTKEY 16 #(16~31)按Shift不放事件
EVENT_FLAG_ALTKEY 32 #(32~39)按Alt不放事件

测试代码

import cv2
import numpy as np

mode =0
#创建回调函数
def OnMouse(event,x,y,flags,param):
    global x0,y0,x1,y1
    if mode==0 and event==cv2.EVENT_LBUTTONDOWN:
        x0, y0 = x, y
        cv2.circle(img, (x, y), 20, (255, 245, 190), 2)
        print('正在画圆\n')
        print("按键盘的'r'切换画矩形")

    if mode ==1 and event == cv2.EVENT_LBUTTONDOWN:
        x1,y1 =x,y
    elif mode == 1 and event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
        print('正在绘制矩形')
        cv2.rectangle(img,(x1,y1),(x,y),(190,255,0),-1)

img = 255*np.ones((480,480,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',OnMouse)

while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1)
    if k==ord('l'):
        mode=0
    elif k==ord('r'):
        mode = 1
    elif k==ord('t'):
        mode =2
    elif k==ord('q'):
        break
cv2.destroyAllWindows()

参考资料:https://blog.csdn.net/bubble_story/article/details/80023599

发表评论