OpenCV Python - 处理鼠标事件


OpenCV 能够使用回调函数注册各种与鼠标相关的事件。这样做是为了根据鼠标事件的类型启动某个用户定义的操作。

先生编号 鼠标事件及描述
1

CV.EVENT_MOUSEMOVE

当鼠标指针移到窗口上时。

2

CV.EVENT_LBUTTONDOWN

表示按下了鼠标左键。

3

CV.EVENT_RBUTTONDOWN

按下鼠标右键的事件。

4

CV.EVENT_MBUTTONDOWN

表示鼠标中键被按下。

5

CV.EVENT_LBUTTONUP

当释放鼠标左键时。

6

CV.EVENT_RBUTTONUP

当释放鼠标右键时。

7

CV.EVENT_MBUTTONUP

表示鼠标中键已释放。

8

CV.EVENT_LBUTTONDBLCLK

当双击鼠标左键时会发生此事件。

9

CV.EVENT_RBUTTONDBLCLK

表示双击鼠标右键。

10

CV.EVENT_MBUTTONDBLCLK

表示双击鼠标中键。

11

CV.EVENT_MOUSEWHEEL

向前滚动为正,向后滚动为负。

要在鼠标事件上触发函数,必须在setMouseCallback()函数的帮助下注册它。其命令如下 -

cv2.setMouseCallback(window, callbak_function)

该函数将事件的类型和位置传递给回调函数以进行进一步处理。

实施例1

每当在显示图像作为背景的窗口上发生左键双击事件时,以下代码就会绘制一个圆圈 -

import numpy as np
import cv2 as cv
# mouse callback function
def drawfunction(event,x,y,flags,param):
   if event == cv.EVENT_LBUTTONDBLCLK:
      cv.circle(img,(x,y),20,(255,255,255),-1)
img = cv.imread('lena.jpg')
cv.namedWindow('image')
cv.setMouseCallback('image',drawfunction)
while(1):
   cv.imshow('image',img)
   key=cv.waitKey(1)
   if key == 27:
      break
cv.destroyAllWindows()

输出

运行上述程序并在随机位置双击。将出现类似的输出 -

鼠标事件

实施例2

以下程序根据用户输入(1,2 或 3)以交互方式绘制矩形、直线或圆形 -

import numpy as np
import cv2 as cv
# mouse callback function

drawing=True
shape='r'

def draw_circle(event,x,y,flags,param):
   global x1,x2
   if event == cv.EVENT_LBUTTONDOWN:
      drawing = True
      x1,x2 = x,y
   elif event == cv.EVENT_LBUTTONUP:
      drawing = False
      if shape == 'r':
         cv.rectangle(img,(x1,x2),(x,y),(0,255,0),-1)
      if shape == 'l':
         cv.line(img,(x1,x2),(x,y),(255,255,255),3)
      if shape=='c':
         cv.circle(img,(x,y), 10, (255,255,0), -1)
img = cv.imread('lena.jpg')
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
   cv.imshow('image',img)
   key=cv.waitKey(1)
   if key==ord('1'):
      shape='r'
   if key==ord('2'):
      shape='l'
   if key==ord('3'):
      shape='c'

   #print (shape)
   if key == 27:
      break
   cv.destroyAllWindows()

在窗口表面上,如果按下“1”,则在鼠标左键向下和向上的坐标之间绘制一个矩形。

如果用户选择为 2,则使用坐标作为端点绘制一条线。

当为圆选择 3 时,它会在鼠标松开事件的坐标处绘制。

下图是上述程序成功执行后的输出 -

鼠标事件