一、用户通过鼠标对图像视窗最常见的操作, 例如:

  1. 左键单击按下

  2. 左键单击抬起

  3. 左键按下拖动

  4. 鼠标指针位置移动

。。。

二、操作响应事件

setMouseCallback()函数: cv2.setMouseCallback('image',OnMouseAction)

OnMouseAction()响应函数: def OnMouseAction(event,x,y,flags,param):

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         //中键双击  

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

int flags,代表鼠标的拖拽事件,以及键盘鼠标联合事件,共有32种事件:

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不放事件  

param 函数指针 标识了所响应的事件函数,相当于自定义了一个OnMouseAction()函数的ID。

三、测试鼠标事件的代码

Opencv中setMouseCallback()创建了一个鼠标回调函数,每次在图像上单击鼠标左键再抬起的过程,都会分3次调用鼠标响应函数,并且响应顺序是:

1.左键单击按下;

2.左键单击抬起;

3.鼠标指针位置移动(即使原地单击,鼠标位置并没有移动);

import cv2
import numpy as np

#创建回调函数
def OnMouseAction(event,x,y,flags,param):

    if event == cv2.EVENT_LBUTTONDOWN:
        print("左键点击")
    elif event==cv2.EVENT_RBUTTONDOWN :
        print("右键点击")
    elif flags==cv2.EVENT_FLAG_LBUTTON:
        print("左鍵拖曳")
    elif event==cv2.EVENT_MBUTTONDOWN :
        print("中键点击")

'''
创建回调函数的函数setMouseCallback();
下面把回调函数与OpenCV窗口绑定在一起
'''
img = np.zeros((500,500,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',OnMouseAction)     
cv2.imshow('image',img)
cv2.waitKey(30000)
cv2.destroyAllWindows()

四、鼠标事件 练习

做一个简单可切换画图模式的画板 默认初始是 线段模式, 按下“L” 进入线段模式, 按下“T” 进入矩阵模式。

import cv2
import numpy as np

mode = 0

#创建回调函数
def OnMouseAction(event,x,y,flags,param):
    global x1, y1
    
    if mode == 0 and event == cv2.EVENT_LBUTTONDOWN:
        print("左键点击")
        cv2.line(img,(0,0),(x,y),(255,255,0),2)
        
    if mode == 1 and event == cv2.EVENT_LBUTTONDOWN:
        print("左键点击1")
        x1, y1 = x, y
    elif mode == 1 and event==cv2.EVENT_MOUSEMOVE and flags ==cv2.EVENT_FLAG_LBUTTON:
        print("左鍵拖曳1")
        cv2.rectangle(img,(x1,y1),(x,y),(0,255,0),-1)
            
'''
下面把回调函数与OpenCV窗口绑定在一起
'''
img = np.zeros((500,500,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',OnMouseAction)
while(1):
    cv2.imshow('image',img)
    k=cv2.waitKey(1)
    if k==ord('l'):
        mode = 0
    elif k==ord('t'):
        mode = 1
    elif k==ord('q'):
        break
cv2.destroyAllWindows()