鼠标事件即包括:左键按下,左键松开,左键双击,鼠标移动等,主要需掌握函数cv2.setMouseCallback(windowName, onMouse [, param])及其对应的回调函数。下面一一进行介绍。
cv2.setMouseCallback(windowName, onMouse [, param])
回调函数形如:def callback(event,x,y,flags,param)
event:鼠标事件,通过如下代码可以查看所有事件
[i for i in dir(cv2) if 'EVENT' in i]
下面通过一个简单的案例来实现鼠标画圆操作,代码如下:
import cv2
import numpy as np
#新建图片
img=np.zeros((500,500))
#定义回调函数,此处只用到了event,x,y三个参数
def draw_circle(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDBLCLK:
#画圆函数,参数分别表示原图、坐标、半径、颜色、线宽(若为-1表示填充)
cv2.circle(img,(x,y),20,255,-1)
cv2.namedWindow('img')
#新建鼠标事件
cv2.setMouseCallback('img',draw_circle)
while(1):
cv2.imshow('img',img)
if cv2.waitKey(1)==ord('q'):
break
cv2.destroyAllWindows()
拓展:现通过结合滑动条和鼠标事件绘制不同半径大小的圆,代码如下:
import cv2
import numpy as np
#新建图片
img=np.zeros((500,500))
#初始半径为5
radius=5
#新建窗口
cv2.namedWindow('img')
#定义滑动条回调函数,修改半径值
def circle_radius(x):
global radius
radius=x
#新建滑动条,初始值5,最大值为50
cv2.createTrackbar('radius','img',5,50,circle_radius)
#定义鼠标事件回调函数,此处只用到了event,x,y三个参数
def draw_circle(event,x,y,flags,param):
global radius
if event==cv2.EVENT_LBUTTONDBLCLK:
#画圆函数,参数分别表示原图、坐标、半径、颜色、线宽(若为-1表示填充)
cv2.circle(img,(x,y),radius,255,-1)
#新建鼠标事件
cv2.setMouseCallback('img',draw_circle)
while(1):
cv2.imshow('img',img)
if cv2.waitKey(1)==ord('q'):
break
cv2.destroyAllWindows()
GIF效果如下:
#欢迎关注我的微信公众号