Python OpenCV 鼠标交互实战:从零开始实现自定义绘图工具
在计算机视觉的世界里,OpenCV(Open Source Computer Vision Library)无疑是最强大的工具之一,虽然我们通常用它来自动化处理图像或视频,但通过结合 Python 和 OpenCV 的鼠标事件功能,我们可以创建极具交互性的应用程序。
从简单的图像标注工具到复杂的 ROI(感兴趣区域)选取器,鼠标事件是连接用户与图像处理算法的桥梁,本文将带你深入探索如何利用 Python 和 OpenCV 实现鼠标交互。
核心概念:什么是鼠标回调?
在 OpenCV 中,鼠标事件是通过 cv2.setMouseCallback() 函数来处理的,我们需要定义一个“回调函数”,当鼠标在窗口上发生特定动作(如按下、移动、松开)时,这个函数就会被自动调用。
OpenCV 支持多种鼠标事件,最常用的是:
- cv2.EVENT_LBUTTONDOWN:鼠标左键按下。
- cv2.EVENT_RBUTTONDOWN:鼠标右键按下。
- cv2.EVENT_MOUSEMOVE:鼠标移动。
- cv2.EVENT_LBUTTONUP:鼠标左键松开。
实战案例:在图像上绘制矩形
下面是一个完整的代码示例,我们将编写一个程序,允许用户在图像上按住鼠标左键拖动来绘制矩形,松开鼠标完成绘制。
准备工作
你需要安装 OpenCV 和 NumPy:
pip install opencv-python numpy
代码实现
import cv2
import numpy as np
# 1. 读取图像
# 请确保你的文件夹中有一张名为 'image.jpg' 的图片,或者修改路径
image_path = 'image.jpg'
img = cv2.imread(image_path)
if img is None:
print(f"Error: Could not load image from {image_path}")
exit()
# 创建一个副本用于显示,避免直接修改原图
canvas = img.copy()
# 2. 定义全局变量
drawing = False # 是否正在绘制
ix, iy = -1, -1 # 鼠标按下的起始坐标
# 3. 定义鼠标回调函数
def draw_rectangle(event, x, y, flags, param):
global ix, iy, drawing, canvas
# 左键按下
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y # 记录起始点
# 鼠标移动
elif event == cv2.EVENT_MOUSEMOVE:
if drawing:
# 如果正在绘制,先清空画布(恢复原图),再画新的矩形
# 注意:这里为了演示简单,直接覆盖画布,实际应用中可能需要重绘所有历史形状
cv2.imshow('Drawing', canvas)
# 画出当前拖动的矩形
cv2.rectangle(canvas, (ix, iy), (x, y), (0, 255, 0), -1)
# 左键松开
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
# 绘制最终矩形
cv2.rectangle(canvas, (ix, iy), (x, y), (0, 255, 0), -1)
cv2.imshow('Drawing', canvas)
# 4. 设置窗口属性并绑定回调
cv2.namedWindow('Drawing')
cv2.setMouseCallback('Drawing', draw_rectangle)
# 5. 显示图像
cv2.imshow('Drawing', canvas)
print("按任意键关闭窗口...")
cv2.waitKey(0)
cv2.destroyAllWindows()
代码深度解析
cv2.setMouseCallback(window_name, callback):这是核心函数,我们将窗口名和我们的draw_rectangle函数绑定在一起,OpenCV 会捕获所有的鼠标事件并传递给这个函数