OpenCV Python 处理鼠标事件

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

输出

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

OpenCV Python 处理鼠标事件

示例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绘制一个圆形,位置在鼠标松开的坐标处。

在成功执行上述程序之后,以下图像将是输出结果。

OpenCV Python 处理鼠标事件

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程