(笔记二)利用opencv调用鼠标事件在图像上绘制图形

目录

    • (1)查看cv2所支持的鼠标事件
    • (2)通过鼠标事件在图像上做标记
    • (3)高级操作:通过移动鼠标在图像绘制图形、曲线


该功能主要创建一个鼠标事件发生时执行的回调函数。鼠标事件可以是任何与鼠标有关的东西,例如左键,左键,左键双击等。它给我们每个鼠标事件的坐标(x,y)。有了这个活动和地点,我们可以做任何我们喜欢的事情。

(1)查看cv2所支持的鼠标事件

opencv官网解释鼠标事件 其对以下函数有详细介绍

import cv2
# 通过dir访问cv2的EVENT事件
events=[i for i in dir(cv2) if 'EVENT'in i]
print(events)

在这里插入图片描述

(2)通过鼠标事件在图像上做标记

代码中已经给出注释,这里就不做过多说明,具体可刨析源码

在这里插入图片描述

# 构建一个画圆事件
# 发生鼠标事件时鼠标在图像位置的x,y坐标def draw(event, x, y, flags, param):# 事件调用鼠标,双击鼠标左键if event == cv2.EVENT_LBUTTONDBLCLK:# 将鼠标双击处的坐标转为字符串location = '(' + str(x) + ',' + str(y) + ')'# 可有可无,若是想输出上述坐标即可保留# print(location)# 在鼠标点击处绘制标记cv2.drawMarker(img, (x, y), (255, 0, 0), cv2.MARKER_CROSS, thickness=1)# 在鼠标点击处绘制圆cv2.circle(img, (x, y), 50, (0, 255, 0), 1)# 在鼠标点击处显示当前图像坐标cv2.putText(img, location, (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, [0, 0, 255], 1)# img = np.zeros((512, 512, 3), np.uint8)
img = cv2.imread(r"D:\data\img.png")
# 创建窗口
cv2.namedWindow('draw_img')
# 将窗口与回调函数绑定
cv2.setMouseCallback('draw_img', draw)
while True:cv2.imshow('draw_img', img)# 按q结束当前窗口if cv2.waitKey(1) & 0xFF == ord('q'):break
cv2.destroyAllWindows()

(3)高级操作:通过移动鼠标在图像绘制图形、曲线

代码中已经给出注释,这里就不做过多说明,具体可刨析源码

在这里插入图片描述

# 此时为False,当鼠标产生反应时变成True
drawn = False
# 当model为True时为绘制矩形,当按下m时为绘制曲线
mode = True
ix, iy = -1, -1# 创建回调函数def drawing(event, x, y, flags, param):global ix, iy, drawn, mode# 按下鼠标左键时返回初始坐标if event == cv2.EVENT_LBUTTONDOWN:drawn = Trueix, iy = x, y# event用于判断鼠标左键按下时并移动是绘制图形,flags用于判断鼠标是否按下了左键elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:# 当鼠标移动事件为真时if drawn:# 如果没有按下m则mode为真,此时为绘制矩形if mode:# 绘制矩形cv2.rectangle(img, (ix, iy), (x, y), (30, 120, 0), -1)# 当按下m后,此时为绘制曲线else:# 绘制圆cv2.circle(img, (x, y), 1, (0, 255, 255), -1)# 当鼠标松开时,停止绘图elif event == cv2.EVENT_LBUTTONUP:drawn = Falseif __name__ == '__main__':img = cv2.imread(r"D:\data\img.png")cv2.namedWindow('name window')cv2.setMouseCallback('name window', drawing)while 1:cv2.imshow('name window', img)k = cv2.waitKey(1) & 0xFFif k == ord('m'):mode = not modeelif k == ord('q'):breakcv2.destroyAllWindows()

在图像上绘制边框矩阵

其代码和上个代码很类似,只需要调整一下

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/60367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

根据身高重建队列【贪心算法】

根据身高重建队列 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返…

SQL注入漏洞复现(CVE-2017-8917)

文章目录 搭建环境启动环境漏洞复现报错注入使用sqlmap 前提条件: 1.安装docker docker pull medicean/vulapps:j_joomla_22.安装docker-compose docker run -d -p 8000:80 medicean/vulapps:j_joomla_23.下载vulhub Docker Compose是 docker 提供的一个命令行工具&…

Mysql中九种索引失效场景分析

表数据: 索引情况: 其中a是主键,对应主键索引,bcd三个字段组成联合索引,e字段为一个索引 情况一:不符合最左匹配原则 去掉b1的条件后就不符合最左匹配原则了,导致索引失效 情况二&#xff…

go学习-指针 标识符

指针,以及标识符 1.指针 (1).基本介绍 1)基本数据类型,变量存的值,也叫值类型 2)获取变量的地址用&,比如 var num int ,获取num的地址:&num 3)指针类型&…

小程序隐私保护授权处理方式之弹窗组件

欢迎点击关注-前端面试进阶指南:前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的🪜 小程序隐私保护授权弹窗组件 调用wx.getUserProfile进行授权时,返回错误信息:{errMsg: “getUserProfile:fail api scope is…

智慧排水监测系统:创新监测技术保障排水系统安全运行

城市排水系统作为城市基础设施的重要组成部分,其安全运行直接关系到环境卫生、居民生活和城市发展。为了确保排水系统的顺畅运行,传统的监测手段已经不能满足日益复杂的城市排水需求,物联网技术的快速发展为排水系统的监测带来了巨大的便利&a…

科普宣传片制作思路

科普宣传片可以针对不同的科学领域和主题,包括自然科学、生命科学、物理学、化学、天文学、地球科学、环境保护等,提供具体的案例、实验和研究成果,帮助观众更好地理解和应用科学知识。科普宣传片的制作思路可以根据具体的科普主题和目标观众…

基于ssm vue智慧城市实验室主页系统源码和论文

基于ssm vue智慧城市实验室主页系统源码和论文059 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方…

基于协同滤波推荐算法的图书管理系统

目录 一、项目概述 二、技术框架 三、功能设计 四、数据库设计 五、项目截图 六、技术文档 一、项目概述 Hi,大家好,今天分享的项目是《基于协同滤波推荐算法的图书管理系统》,对用户登录注册、图书推荐、图书管理、用户信息进行管理&…

Vue3响应式原理 私

响应式的本质:当数据变化后会自动执行某个函数映射到组件,自动触发组件的重新渲染。 响应式的实现方式就是劫持数据,Vue3的reactive就是通过Proxy劫持数据,由于劫持的是整个对象,所以可以检测到任何对象的修改&#xf…

版本控制 Git工具的使用

版本控制的概念: 版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。简单来说就是用于管理多人协同开发…

C语言每日一练------(Day3)

本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。 今天练习题的关键字: 尼科彻斯定理 等差数列 💓博主csdn个人主页&#xff1a…

2023_Spark_实验一:Windows中基础环境安装

Ⅰ、WINDOWS中安装JDK1.8 一、下载安装包 链接:百度网盘 请输入提取码 所在文件夹:根目录或者大数据必备工具--》开发工具(前端后端)--》后端 下载文件名称:jdk-8u191-windows-x64.exe 二、安装JDK 1.现在转到下载的exe文件可用的文件夹&…

【Vue3+Ts】项目启动准备和配置项目代码规范和css样式的重置

项目启动准备 创建项目( 使用Vite 构建工具创建项目模板)目录介绍插件安装创建别名编译说明项目配置配置icon和标题配置项目别名配置ts.config.json检测vscode的插件是否配置 配置项目代码规范集成editorconfig配置prettier工具库ESLint检测配置 CSS样式…

transformer实现词性标注

1、self-attention 1.1、self-attention结构图 上图是 Self-Attention 的结构,在计算的时候需要用到矩阵 Q(查询), K(键值), V(值)。在实际中,Self-Attention 接收的是输入(单词的表示向量 x组成的矩阵 X) 或者上一个 Encoder block 的输出。而 Q, K, V…

Hive-启动与操作(2)

🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 个人主页:beixi 本文章收录于专栏(点击传送):【大数据学习】 💓💓持续更新中,感谢各位前辈朋友们支持…

测试左移——代码审计SonarQube 平台搭建

一、sonarqube代码分析技术体系 1、代码分析工具 IDE 辅助功能 xcode、android studio阿里巴巴 java 开发手册 ide 插件支持 独立的静态分析工具 spotbugs、findbugs、androidlint、scan-build、Checkstyle、FindSecBugspmd 阿里巴巴 java 开发手册 pmd 插件 综合性的代码…

堆,堆排序和TOP—K问题(C语言版)

前言 堆是一种重要的数据结构,堆分为大根堆和小根堆,大根堆堆顶的数据是最大的,小根堆堆顶的数据是最小的,堆在逻辑结构上是一颗完全二叉树,这棵树中如果满足根节点大于左右子树,每个节点都满足这个条件就是…

Rabbitmq的Shovel

Federation 具备的数据转发功能类似, Shovel 够可靠、持续地从一个 Broker 中的队列 ( 作为源端,即source)拉取数据并转发至另一个 Broker 中的交换器 ( 作为目的端,即 destination) 。作为源端的队列和作为目的端的交换器可以同时位于…

微服务dubbo和nexus

微服务是一种软件开发架构风格,它将一个应用程序拆分成一组小型、独立的服务,每个服务都可以独立部署、管理和扩展。每个服务都可以通过轻量级的通信机制(通常是 HTTP/REST 或消息队列)相互通信。微服务架构追求高内聚、低耦合&am…