Python Opencv鼠标回调

ops/2024/9/24 6:17:45/

使用 OpenCV 的 cv2.setMouseCallback() 方法来捕捉鼠标事件,并实现以下功能:

  1. 实时在鼠标指针附近显示其位置的像素坐标。
  2. 通过左键双击,将像素坐标记录到数组中。
  3. 通过右键点击,取消上一次添加的坐标。

下面是实现代码的示例:

python">import cv2
import numpy as np# 初始化一个数组,用于存储点击的坐标
coords = []# 鼠标回调函数
def mouse_callback(event, x, y, flags, param):global coords# 左键双击,记录坐标if event == cv2.EVENT_LBUTTONDBLCLK:coords.append((x, y))print(f"记录坐标: {x}, {y}")# 右键单击,取消上一次记录的坐标elif event == cv2.EVENT_RBUTTONDOWN:if coords:removed_coord = coords.pop()print(f"取消坐标: {removed_coord}")# 创建窗口并绑定鼠标回调函数
cv2.namedWindow("Image")
cv2.setMouseCallback("Image", mouse_callback)# 读取图像
img = cv2.imread("your_image.jpg")while True:# 在图像上显示鼠标当前位置img_copy = img.copy()mouse_x, mouse_y = cv2.getWindowImageRect('Image')[:2]# 获取当前鼠标坐标cv2.putText(img_copy, f"({mouse_x}, {mouse_y})", (mouse_x + 20, mouse_y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)# 显示图像cv2.imshow("Image", img_copy)# 按 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 关闭所有窗口
cv2.destroyAllWindows()# 输出最终记录的坐标
print("最终记录的坐标: ", coords)

代码说明:

  1. 鼠标回调函数 mouse_callback

    • 捕捉鼠标的事件,包括左键双击和右键点击。
    • 左键双击事件 cv2.EVENT_LBUTTONDBLCLK 记录当前的鼠标位置。
    • 右键点击事件 cv2.EVENT_RBUTTONDOWN 移除上一次添加的坐标。
  2. cv2.getWindowImageRect()

    • 该函数用于获取窗口图像矩形的尺寸以及鼠标位置。你可以实时显示鼠标坐标。
  3. 实时显示鼠标坐标

    • 使用 cv2.putText() 在图像上显示鼠标当前位置。
  4. 记录坐标

    • 双击左键时,鼠标位置将会被添加到 coords 数组中,右键点击则会移除最后一个记录的坐标。
  5. 退出

    • q 键退出显示循环,并打印最终的坐标。

http://www.ppmy.cn/ops/107010.html

相关文章

python3删除es 45天前索引,生产环境验证过

本人es版本 环境 pip install --upgrade elasticsearch==7.16.3代码 from datetime import datetime, timedelta from elasticsearch import Elasticsearch

走迷宫(BFS)

给定一个 nmnm 的二维整数数组,用来表示一个迷宫,数组中只包含 00 或 11,其中 00 表示可以走的路,11 表示不可通过的墙壁。 最初,有一个人位于左上角 (1,1)(1,1) 处,已知该人每次可以向上、下、左、右任意…

数据结构代码集训day13(适合考研、自学、期末和专升本)

题目来自:B站up白话拆解数据结构 今日题目如下: 设线性表 L ( a1,a2,a3…,an-2,an-1,an) 采用带头结点的单链表保存,链表中结点定义如下:typedef struct node {int data…

2024最新Redis面试题含答案

(3)、队列 Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操…

超市会员管理系统

1.会员实体类 import java.io.Serializable;//会员实体类 public class SuperPojo implements Serializable {private String name; //会员姓名private String pwd; //会员密码private int cardId; //会员卡号private int cardNum; //会员积分priva…

四战搜索,抖音难造“百度”

转载:新熵 原创 作者丨余寐 编辑丨九犁 抖音搜索野心暴露无遗!接连4次发起猛攻,这是要颠覆搜索市场的节奏?还是因为流量触顶,急寻新入口? 执念太深!抖音还是没放弃搜索,并发起一场…

JUnit 5和Mockito进行单元测试!

1. JUnit 5 基础 JUnit 5是最新的JUnit版本,它引入了许多新特性,包括更灵活的测试实例生命周期、参数化测试、更丰富的断言和假设等。 1.1 基本注解 Test:标记一个方法为测试方法。 BeforeEach:在每个测试方法之前执行。 AfterEac…

Java Spring中自动注入(Field Injection)与构造器注入(Constructor Injection)的深入分析

在Java开发中,依赖注入(Dependency Injection, DI)是Spring框架中一个核心概念,用于将对象的依赖关系注入到类中,从而实现松耦合和提高可测试性。依赖注入的方式主要有两种:自动注入和构造器注入。本文将从…