1. 打印鼠标事件
我们首先打印出鼠标的事件:
代码:
import cv2
events=[i for i in dir(cv2) if 'EVENT'in i] #将全部事件保存在列表中
print (events) #将列表打印
结果:
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不放事件
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 #中键双击
2. 回调函数
为了实现单击两次画矩形的目的,首先定义了三个全局变量
n --> 判断鼠标按下的次数
ix,iy --> 存储第一次鼠标单击的坐标
#定义全局变量
n = 0 #定义鼠标按下的次数
ix = 0 # x,y 坐标的临时存储
iy = 0
#鼠标回调函数
def draw_rectangle(event,x,y,flags,param):
global n,ix,iy
if event==cv2.EVENT_LBUTTONDOWN :
if n == 0: #首次按下保存坐标值
n+=1
ix,iy = x,y
cv2.circle(img,(x,y),2,(255,255,255),-1) #第一次打点
else: #第二次按下显示矩形
n = 0
cv2.rectangle(img,(ix,iy),(x,y),(255,255,255),3) #第二次画矩形
在回调函数中首先使用global声明了三个全局变量,然后判断是否是事件发生。
如果第一次按下,按下次数加一,存储第一次按下位置并且在该位置打点做标记。
如果第二次按下,按下次数清零,用两次的位置作为对角点画矩形。
3. 绑定函数
# 创建图像与窗口并将窗口与回调函数绑定
img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_rectangle)
首先创建了一张512*512的黑色窗口,然后将鼠标与窗口和回调函数绑定
4. 全部代码
import cv2
import numpy as np
#定义全局变量
n = 0#定义鼠标按下的次数
ix = 0# x,y 坐标的临时存储
iy = 0
#鼠标回调函数
def draw_rectangle(event,x,y,flags,param):
global n,ix,iy
if event==cv2.EVENT_LBUTTONDOWN :
if n == 0:#首次按下保存坐标值
n+=1
ix,iy = x,y
cv2.circle(img,(x,y),2,(255,255,255),-1)#第一次打点
else:#第二次按下显示矩形
n = 0
cv2.rectangle(img,(ix,iy),(x,y),(255,255,255),3)#第二次画矩形
# 创建图像与窗口并将窗口与回调函数绑定
img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_rectangle)
#显示并延时
while(1):
cv2.imshow('image',img)
if cv2.waitKey(20)&0xFF==27:
break
#销毁所有窗口
cv2.destroyAllWindows()