写在最前:本章的目标是学会如何用OpenCV处理鼠标事件,我们将会学会几个函数。
OnMouse(event,x,y,flags,param)
setMouseCallback(windowsname,OnMouse)
这两个函数搭配使用便可以处理鼠标传来的事件并进行相关操作。
- event表示鼠标事件:
EVENT_MOUSEMOVE #滑动
EVENT_LBUTTONDOWN #左键点击
EVENT_RBUTTONDOWN #右键点击
EVENT_MBUTTONDOWN #中键点击
EVENT_LBUTTONUP #左键放开
EVENT_RBUTTONUP #右键放开
EVENT_MBUTTONUP #中键放开
EVENT_LBUTTONDBLCLK #左键双击
EVENT_RBUTTONDBLCLK #右键双击
EVENT_MBUTTONDBLCLK #中键双击
- x,y表示鼠标在窗口的坐标
- falgs表示鼠标的拖拽事件或者键鼠联合事件
EVENT_FLAG_LBUTTON #左鍵拖曳
EVENT_FLAG_RBUTTON #右鍵拖曳
EVENT_FLAG_MBUTTON #中鍵拖曳
EVENT_FLAG_CTRLKEY #(8~15)按Ctrl不放事件
EVENT_FLAG_SHIFTKEY #(16~31)按Shift不放事件
EVENT_FLAG_ALTKEY #(32~39)按Alt不放事件
在我的理解,OnMouse这个函数的参数是固定的,这个函数的用处就是告诉setMouseCallBack鼠标发生了什么事件,这个事件对应的操作是什么,具体不必深究。
例1:
鼠标左键单击一次就画一个圆
import numpy as np
import cv2
def OnMouse(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDOWN:
cv2.circle(img,(x,y),50,(255,0,0),5)
img=np.zeros((520,520,3),np.uint8)#创建一个520*520的黑色底板
cv2.namedWindow('image')
cv2.setMouseCallback('image',OnMouse)
while(True):
cv2.imshow('image',img)
if cv2.waitKey(1)&0xFF == ord('e'):
break
cv2.destroyAllWindows()
例2
实现类似画图工具的简单功能,左键拖动画线,左键拖动画矩形。使用e键切换这两个功能。
import numpy as np
import cv2
#全局变量
drawing=False#鼠标点击即为True
mode=True
ix=-1
iy=-1
def OnMouse(event,x,y,flags,param):
global drawing,mode,ix,iy
if event == cv2.EVENT_LBUTTONDOWN:#左键按下则返回左键第一次点的位置
drawing=True
ix,iy=x,y
elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
if drawing == True:
if mode == True:
cv2.rectangle(img,(ix,iy),(x,y),(255,255,0),3)#绘制矩形
else:
cv2.circle(img,(x,y),3,(255,0,0),-1)#很多小圆连在一起就是线
elif event== cv2.EVENT_LBUTTONUP:#按键抬起则推出
drawing=False
img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',OnMouse)
while(True):
cv2.imshow('image',img)
k=cv2.waitKey(25)&0xFF
if k == ord('e'):
mode=not mode
elif k == ord('s'):
break
cv2.destroyAllWindows()