1、用户经过鼠标对图像视窗最多见的操做,
例如:ide
左键单击按下函数
左键单击抬起测试
左键按下拖动ui
。。。指针
2、操做响应事件code
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);it
int flags,表明鼠标的拖拽事件,以及键盘鼠标联合事件,共有32种事件:io
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。
3、测试鼠标事件的代码
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()
4、鼠标事件 练习
作一个简单可切换画图模式的画板
默认初始是 线段模式,
按下“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()