Opencv Python 简明教程

OpenCV Python - Handling Mouse Events

OpenCV 能够用一个回调函数来注册各种鼠标相关事件。这用于根据鼠标事件的类型来启动一个特定用户定义的动作。

Sr.No

Mouse event & Description

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)

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

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

Output

运行以上程序然后在随机位置双击。将会看到类似的输出:

mouse events

Example 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 绘制圆,则会在鼠标抬起事件的坐标处绘制一个圆。

在成功执行以上程序后,输出将显示如下图像:

mouse event