当前位置: 首页 > news >正文

Python Opencv鼠标回调

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

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

下面是实现代码的示例:

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 键退出显示循环,并打印最终的坐标。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • error C2275: 将此类型用作表达式非法-解决方案
  • ubuntu 安装配置 ollama ,添加open-webui
  • C#LINQ常用扩展语句
  • 半天玩转大模型技术之RAG
  • cache miss问题C++示例
  • visio修改默认字体、颜色、形状格式、连接线格式
  • 苍穹外卖学习笔记(二)
  • 软考系统分析师难吗?现在开始准备需要多久能考试?
  • C语言-第九章-加餐:文件位置指示器与二进制读写
  • 桂林自闭症寄宿学校:用关爱点亮未来
  • 神经网络的可解释性理论及工具
  • python如何获取html中的所有链接
  • 【Go】Go语言基本语法--注释、变量、常量
  • 算法设计与分析(整数划分问题
  • 哪些录屏工具最适合游戏录制?2024年Top4录屏工具梳理
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • js正则,这点儿就够用了
  • 对象管理器(defineProperty)学习笔记
  • - 概述 - 《设计模式(极简c++版)》
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 聊聊flink的TableFactory
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 译有关态射的一切
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​比特币大跌的 2 个原因
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #pragma once与条件编译
  • ${ }的特别功能
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2)STL算法之元素计数
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (蓝桥杯每日一题)love
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)jdk与jre的区别
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .gitignore文件---让git自动忽略指定文件
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Framework 3.5安装教程
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • @Async 异步注解使用
  • @javax.ws.rs Webservice注解
  • @SpringBootApplication 包含的三个注解及其含义