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

news2024/11/22 14:09:07

目录

    • (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 = True
        ix, 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 = False


if __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) & 0xFF
        if k == ord('m'):
            mode = not mode
        elif k == ord('q'):
            break
    cv2.destroyAllWindows()

在图像上绘制边框矩阵

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

在这里插入图片描述

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

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

相关文章

配置Flink

配置flink_1.17.0 1.Flink集群搭建1.1解压安装包1.2修改集群配置1.3分发安装目录1.4启动集群、访问Web UI 2.Standalone运行模式3.YARN运行模式4.K8S运行模式 1.Flink集群搭建 1.1解压安装包 链接: 下载Flink安装包 解压文件 [gpbhadoop102 software]$ tar -zxvf flink-1.1…

前端需要理解的性能优化知识

优化的目的是展示更快、交互响应快、页面无卡顿情况。 1 性能指标 2 分析方法 使用 ChromeDevTool 作为性能分析工具来观察页面性能情况。其中Network观察网络资源加载耗时及顺序,Performace观察页面渲染表现及JS执行情况,Lighthouse对网站进行整体评分…

Linux驱动-I2C子系统基本分析

​第一:Linux中I2C驱动框架分析 I2C核心(i2c_core) I2C核心维护了i2c_bus结构体,提供了I2C总线驱动和设备驱动的注册、注销方法,维护了I2C总线的驱动、设备链表,实现了设备、驱动的匹配探测。此部分代码由…

CNN 01(CNN简介)

一、卷积神经网络的发展 convolutional neural network 在计算机视觉领域,通常要做的就是指用机器程序替代人眼对目标图像进行识别等。那么神经网络也好还是卷积神经网络其实都是上个世纪就有的算法,只是近些年来电脑的计算能力已非当年的那种计算水平…

sql语句中的ddl和dml

操作数据库:CRUD C(create) 创建 *数据库创建出来默认字符集为utf8 如果要更改字符集就 Create database 名称 character set gbk(字符集) *创建数据库:create database 名称 *先检查是否有该数据库在…

Python第三方库纵览

Python第三方库纵览 知识点 更广泛的Python计算生态,只要求了解第三方库的名称,不限于以下领域: 网络爬虫、数据分析、文本处理、数据可视化、用户图形界面、机器学习、Web开发、游戏开发等 知识导图 1、网络爬虫方向 网络爬虫是自动进行HTTP访问并捕…

【JAVA】实现API 接口参数签名

使用sa-tokenSpringBoot拦截器实现API 接口参数签名 在涉及跨系统接口调用时,我们容易碰到以下安全问题: 1.请求身份被伪造。 2.请求参数被篡改。 3.请求被抓包,然后重放攻击。 1.引入 sa-token sa-token官方文档:https://sa-token.cc/doc.ht…

HCIP-HCS华为私有云

1、概述 HCS(HuaweiCoudStack)华为私有云:6.3 之前叫FusionSphere OpenStack,6.3.1 版本开始叫FusionCloud,6.5.1 版本开始叫HuaweiCloud Stack (HCS)华为私有云软件。 开源openstack,发放云主机的流程&am…

第五章 树与二叉树 一、树的定义与考点

一、定义 1.树是由n (n > 0) 个节点组成的有限集合。 2.当n0时,称为空树。 3.在非空树中,有且仅有一个节点没有前驱,其他节点都有且仅有一个前驱,称为根节点。 4.每个节点有零个或多个子节点,而每个子节点又有零…

多态/虚函数/虚函数表

OVERVIEW 多态/虚函数/虚函数表1.虚函数引入后类发生的变化?2.虚函数表的生成时机和生成原因?3.虚函数表指针赋值的时机?4.类对象在内存中的布局?5.虚函数的工作原理和多态性的体现?6.其他问题 多态/虚函数/虚函数表 n…

Android JNI系列详解之生成指定CPU的库文件

一、前提 这次主要了解Android的cpu架构类型,以及在使用CMake工具的时候,如何指定生成哪种类型的库文件。 如上图所示,是我们之前使用CMake工具默认生成的四种cpu架构的动态库文件:arm64-v8a、armeabi-v7a、x86、x86_64&#xff0…

昇腾Ascend+C编程入门教程(纯干货)

2023年5月6日,在昇腾AI开发者峰会上,华为正式发布了面向算子开发场景的昇腾Ascend C编程语言。Ascend C原生支持C/C编程规范,通过多层接口抽象、并行编程范式、孪生调试等技术,极大提高了算子的开发效率,帮助AI开发者低…

go学习之流程控制语句

文章目录 流程控制语句1.顺序控制2.分支控制2.1单分支2.2双分支单分支和双分支的四个题目switch分支结构 3.循环控制for循环控制while 和do...while的实现 4.跳转控制语句breakcontinuegotoreturngotoreturn 流程控制语句 介绍:在程序中,程序运行的流程…

星际争霸之小霸王之小蜜蜂(七)--消失的子弹

目录 前言 一、删除子弹 二、限制子弹数量 三、继续重构代码 总结 前言 昨天我们已经让子弹飞了起来,但是会面临一个和之前小蜜蜂一样的问题,小蜜蜂的行动应该限制在窗口内,那么子弹也是有相同之处,也需要限制一个移动范围&…

智慧监狱整体解决方案PPT

导读:原文《智慧监狱整体解决方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 喜欢文章,您可以点赞评论转发本文,了解更多…

全球互联网裁员下测试人员何去何从?

时间好像突然加快了步伐瞬间觉得匆匆,转眼已经23年,从20年到23年。回想起来恍恍惚惚,疫情中经历的种种就好像没有发生过一样,很多的魑魅魍魉荒唐可笑真实又虚幻,时光向前人生向后,那些魔幻的人和事也慢慢消…

可解释性的相关介绍

一、可解释性的元定义(Meta-definitions of Interpretability) The extent to which an individual can comprehend the cause of a model’s outcome. [1]The degree to which a human can consistently predict a model’s outcome. [2] 可解释性&am…

Flutter 项目结构文件

1、Flutter项目的文件结构 先helloworld项目,看看它都包含哪些组成部分。首先,来看一下项目的文件结构,如下图所示。 2、介绍上图的内容。 -litb/main.dart文件:整个应用的入口文件,其中的main函数是整个Flutter应…

Fei-Fei Li-Lecture 16:3D Vision 【斯坦福大学李飞飞CV课程第16讲:3D Vision】

目录 P1 2D Detection and Segmentation​编辑 P2 Video 2D time series P3 Focus on Two Problems P4 Many more topics in 3D Vision P5-10 Multi-View CNN P11 Experiments – Classification & Retrieval P12 3D Shape Representations P13--17 3D Shape Rep…