OpenCV - 处理鼠标事件(Python实现)

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()

效果图:
OpenCV - 处理鼠标事件(Python实现)_第1张图片

你可能感兴趣的:(【OpenCV】)