创建鼠标时间回调函数,当鼠标事件发生的时候就会被执行。
所有的鼠标事件回调函数都有一个统一的格式,不同的地方是被调用后的功能。
根据opencv的官方文档,鼠标的事件有:
鼠标事件
注意注意!!!如下所示:
MouseEvent Flags | EVENT_FLAG_ALTKEY | 摁住Alt | 这里指的是 要是按住这些键,在图像中拖动鼠标就会留出痕迹 (连续的) |
EVENT_FLAG_CTRLKEY | 摁住Ctrl | ||
EVENT_FLAG_LBUTTON | 摁住左键 | ||
EVENT_FLAG_MBUTTON | 摁住中键 | ||
EVENT_FLAG_RBUTTON | 摁住右键 | ||
EVENT_FLAG_SHIFTKEY | 摁住Shift | ||
---------------------------------------------------------------------------------- | |||
MouseEvent Type | EVENT_LBUTTONDBLCLK | 左键双击 | 这里指的是 要是进行这些操作,在图像中当时的鼠标就会留出痕迹 (除了这个鼠标移动,其他都是间断的) |
EVENT_LBUTTONDOWN | 左键击下 | ||
EVENT_LBUTTONUP | 左键弹起 | ||
EVENT_MBUTTONDBLCLK | 中键双击 | ||
EVENT_MBUTTONDOWN | 中键击下 | ||
EVENT_MBUTTONUP | 中键弹起 | ||
EVENT_MOUSEHWHEEL | 滚动条向左,flags>0。向右,flags<0 | ||
EVENT_MOUSEMOVE | 鼠标移动 | ||
EVENT_MOUSEWHEEL | 滚动条向上,flags>0。向下,flags<0 | ||
EVENT_RBUTTONDBLCLK | 右键双击 | ||
EVENT_RBUTTONDOWN | 右键击下 | ||
EVENT_RBUTTONUP | 右键弹起 |
代码示例一:
import cv2
import numpy as np
def Mouse_event(event,x,y,flags,param):
if event == cv2.EVENT_MOUSEMOVE:
cv2.circle(img,(x,y),50,(255,255,255),-1)
if flags == cv2.EVENT_FLAG_LBUTTON:
cv2.circle(img, (x, y),20, (0, 255, 0), -1)
img = np.zeros((500,500,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',Mouse_event)
while True:
cv2.imshow('image',img)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
cv2.destroyAllWindows()
注意注意!!!
Mouse_event(event,x,y,flags,param)这个函数括号里面的参数的位置必须是
event,x,y,flags,param,不能写的不一样,否则无法调用或者调用默认值了
可以看一下官网上的文档,对于event和flags,对照一下代码里面的内容,你姑且可以看成是两种操作方式(两种鼠标的处理方式)
代码示例二:
import cv2
import numpy as np
drawing = False
#表示能不能进行画图
mode = True
#切换画图的模式
ix , iy = -1 ,-1
def Mouse_event(event,x,y,flags,param):
global ix,iy,drawing,mode
if event == cv2.EVENT_LBUTTONDOWN:
#只要检测到鼠标按下去了,drawing = True:就表示做好画图的准备了
drawing = True
ix,iy = x,y
#作为画图的起点
print(ix,iy,drawing,mode)
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
#如果鼠标处于拖动的状态,而且是按下的状态,也就是按着拖动的状态
if drawing == True:
#可以画图准备的
if mode == True:
#处于画方图的模式中
print('画方图中',ix, iy, drawing, mode)
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),5)
else:
#处于画圆图的模式中
print('画圆图中',ix, iy, drawing, mode)
cv2.circle(img, (x, y),20, (255, 255, 255), -1)
elif event == cv2.EVENT_LBUTTONUP:
#如果鼠标弹起了,表示鼠标不在是处于画图模式了
drawing = False
img = np.zeros((800,800,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',Mouse_event)
while True:
cv2.imshow('image',img)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord('m'):
mode = not mode
cv2.destroyAllWindows()