python opencv mouse

admin 53 0

Python OpenCV 鼠标交互实战:从零开始实现自定义绘图工具

在计算机视觉的世界里,OpenCV(Open Source Computer Vision Library)无疑是最强大的工具之一,虽然我们通常用它来自动化处理图像或视频,但通过结合 PythonOpenCV 的鼠标事件功能,我们可以创建极具交互性的应用程序。

从简单的图像标注工具到复杂的 ROI(感兴趣区域)选取器,鼠标事件是连接用户与图像处理算法的桥梁,本文将带你深入探索如何利用 PythonOpenCV 实现鼠标交互。

核心概念:什么是鼠标回调?

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

代码深度解析

  1. cv2.setMouseCallback(window_name, callback):这是核心函数,我们将窗口名和我们的 draw_rectangle 函数绑定在一起,OpenCV 会捕获所有的鼠标事件并传递给这个函数