一:鼠标操作
1.查看支持的鼠标事件
鼠标事件可以是鼠标上的任何动作,比如左键按下,左键松开,左键双击等。 我们可以通过鼠标事件获得与鼠标对应的图片上的坐标
#查看支持的鼠标事件
import cv2
events=[i for i in dir(cv2) if 'EVENT'in i]
print(events)
截取一部分结果
EVENT_MOUSEMOVE 滑动
EVENT_LBUTTONDOWN 左键点击
EVENT_RBUTTONDOWN 右键点击
EVENT_MBUTTONDOWN 中键点击
EVENT_LBUTTONUP 左键放开
EVENT_RBUTTONUP 右键放开
EVENT_MBUTTONUP 中键放开
EVENT_LBUTTONDBLCLK 左键双击
EVENT_RBUTTONDBLCLK 右键双击
EVENT_MBUTTONDBLCLK 中键双击
2.指定鼠标操作消息回调函数的函数:SetMouseCallback
(1)函数作用:为指定的窗口设置鼠标回调函数
(2)函数:SetMouseCallback(const String & winname,
MouseCallback onMouse,
void * userdata = 0 )
(3)参数说明:
- 参数1:str类型的winname,窗口的名字
- 参数2:回调函数
- 参数3:用户定义的传递到回调函数的参数,默认值为0,一般可以省略
二:举例
例1:在图片上你双击过的位置绘制一个半径100蓝色填充圆(以点击位置为圆心)
#在图片上你双击过的位置绘制一个半径100蓝色填充圆(以点击位置为圆心)#
import cv2
import numpy as np
img=np.zeros((512,512,3),np.uint8)
def draw_circle(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),100,(255,0,0),-1)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
if cv2.waitKey(20)&0xFF==27:
break
cv2.destroyAllWindows()
例2:根据我们选择的模式在拖动鼠标时绘制矩形或者是圆圈(就像画图程序中一样)。所以我们的回调函数包含两部分,按住左键移动画矩形,按‘c’后按住左键移动画圆圈。
# 开发时间:
import cv2
import numpy as np
img=np.zeros((512,512,3),np.uint8)
#定义画图开关,和画圆开关
#当按下鼠标后drawing为True
drawing=False
#如果mode为True绘制矩形。按下‘c’绘画圆
mode=True
ix,iy=-1,-1
def draw_circle(event,x,y,flags,param):
#定义全局变量ix,iy,drawing,mode
global ix,iy,drawing,mode
#当按下左键返回起始坐标值
if event==cv2.EVENT_LBUTTONDOWN:
drawing=True
ix,iy=x,y
#当鼠标左键按下并移动绘制图形。event可以查看移动,flag查看是否按下
elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
if drawing==True:
if mode==True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
r=int(np.sqrt((x-ix)**2+(y-iy)**2))
cv2.circle(img,(ix,iy),r,(0,0,255),-1)
#当鼠标松开是停止绘画
elif event==cv2.EVENT_LBUTTONUP:
drawing==False
#展示绘图
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
k=cv2.waitKey(1)&0xFF
if k==ord('c'):
mode=not mode
elif k==27:
break