- OpenCV Python 教程
- OpenCV Python - 首页
- OpenCV Python - 概述
- OpenCV Python - 环境配置
- OpenCV Python - 读取图像
- OpenCV Python - 写入图像
- OpenCV Python - 使用 Matplotlib
- OpenCV Python - 图像属性
- OpenCV Python - 位运算
- OpenCV Python - 形状和文本
- OpenCV Python - 鼠标事件
- OpenCV Python - 添加轨迹条
- OpenCV Python - 调整大小和旋转
- OpenCV Python - 图像阈值
- OpenCV Python - 图像滤波
- OpenCV Python - 边缘检测
- OpenCV Python - 直方图
- OpenCV Python - 颜色空间
- OpenCV Python - 图像变换
- OpenCV Python - 图像轮廓
- OpenCV Python - 模板匹配
- OpenCV Python - 图像金字塔
- OpenCV Python - 图像加法
- OpenCV Python - 图像混合
- OpenCV Python - 傅里叶变换
- OpenCV Python - 捕捉视频
- OpenCV Python - 播放视频
- OpenCV Python - 从视频中提取图像
- OpenCV Python - 从图像生成视频
- OpenCV Python - 人脸检测
- OpenCV Python - 均值漂移/CamShift
- OpenCV Python - 特征检测
- OpenCV Python - 特征匹配
- OpenCV Python - 数字识别
- OpenCV Python 资源
- OpenCV Python - 快速指南
- OpenCV Python - 资源
- 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()
输出
运行上述程序并在随机位置双击。将会出现类似的输出:
示例 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 绘制圆形时,它将在鼠标弹起事件的坐标处绘制。
成功执行上述程序后,输出图像如下:
广告