P18 3-10

  • 1 鼠标回调函数
  • 2 鼠标绘制基本图形(直线、圆、矩形)
    • 2.1 图形绘制教程
    • 2.2 鼠标绘制基本图形(直线、圆、矩形)代码实现

1 鼠标回调函数

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


import cv2
import numpy as npdef mouse_callback(event,x,y,flage,userdata):print(event,x,y,flage,userdata)cv2.namedWindow("mouse",cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse',640,360)#窗口尺寸,640行,360列cv2.setMouseCallback('mouse',mouse_callback,'123')#(高,宽,通道数)
img=np.zeros((360,640,3),np.uint8)#高=行数,宽=列数,3通道,每个通道是8位无符号整形数据
while True:cv2.imshow('mouse',img)key=cv2.waitKey(1)if key& 0xff == ord('q'):breakcv2.destroyAllWindows()

在这里插入图片描述

当鼠标在,窗口内移动、点击,等操作时,
event,x,y,flag会输出相应的值;

在这里插入图片描述

2 鼠标绘制基本图形(直线、圆、矩形)

2.1 图形绘制教程

图形绘制教程:图形绘制(line直线、ellipse椭圆、polylines多边形、putText绘制文本)

2.2 鼠标绘制基本图形(直线、圆、矩形)代码实现

基本功能:

  • 1 画线:当按下l键,即选择了画线。此时,滑动鼠标即可画线。
  • 2 画矩形:当按下r键,即选择了画矩形。此时,滑动鼠标即可画矩形。
  • 3 画圆:当按下c键,即选择了画圆。此时,滑动鼠标即可画圆。
#全局变量
curshape=0
startpos=(0,0)img=np.zeros((480,640,3),np.uint8)
def mouse_callback(event,x,y,flag,userdata):if event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN:startpos=(x,y)elif event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP:if curshape==0:cv2.line(img,startpos,(x,y),(255,0,0))#起点startpos,终点是当前x,yelif curshape==1:cv2.rectangle(img,startpos,(x,y),(255,0,0))elif curshape==2:cv2.circle(img,startpos,max(abs(startpos[0]-x),abs(startpos[1]-y)),(255,0,0))#选择dx,dy中最大值,作为半径else:print('error : no shape')
 File "e:\Program_Py\1.py", line 25, in mouse_callbackcv2.line(img,startpos,(x,y),(255,0,0))#起点startpos,终点是当前x,y
UnboundLocalError: local variable 'startpos' referenced before assignment

意思是:局部变量’startpos’在赋值前被引用

#全局变量
将全局变量前加上global

 global curshape,startpos

name ‘curshape’ is not defined

File "e:\Program_Py\1.py", line 23, in mouse_callbackif curshape==0:
NameError: name 'curshape' is not defined
Traceback (most recent call last):File "e:\Program_Py\1.py", line 24, in mouse_callbackcv2.line(img,startpos,(x,y),(255,0,0))#起点startpos,终点是当前x,y
UnboundLocalError: local variable 'startpos' referenced before assignment

正确做法,在函数外面定义一次,在函数里面使用的时候,需要再次全局申明

#全局变量
curshape=0
startpos=(0,0)img=np.zeros((480,640,3),np.uint8)
def mouse_callback(event,x,y,flag,userdata):global curshape,startpos#需要再次全局申明

startpos=(x,y)
当获取点startpo中x值时,startpos.x,报错

File "e:\Program_Py\1.py", line 29, in mouse_callbackcv2.circle(img,startpos,max(abs(startpos.x-x),abs(startpos.y-y)),(255,0,0))
AttributeError: 'tuple' object has no attribute 'x'

改成,startpos[0],OK

#基本功能:
# 1 画线:当按下l键,即选择了画线。此时,滑动鼠标即可画线。
# 2 画矩形:当按下r键,即选择了画矩形。此时,滑动鼠标即可画矩形。
# 3 画圆:当按下c键,即选择了画圆。此时,滑动鼠标即可画圆。#curshape:0-drawline,1-drawrectangle,2-drawcircleimport cv2
import numpy as np#全局变量
curshape=0
startpos=(0,0)img=np.zeros((480,640,3),np.uint8)def mouse_callback(event,x,y,flag,userdata):global curshape,startpos#需要再次全局申明if event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN:startpos=(x,y)elif event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP:if curshape==0:cv2.line(img,startpos,(x,y),(255,0,0))#起点startpos,终点是当前x,yelif curshape==1:cv2.rectangle(img,startpos,(x,y),(255,0,0))elif curshape==2:cv2.circle(img,startpos,max(abs(startpos[0]-x),abs(startpos[1]-y)),(255,0,0))#选择dx,dy中最大值,作为半径else:print('error : no shape')cv2.namedWindow('drawshape',cv2.WINDOW_NORMAL)
cv2.setMouseCallback('drawshape',mouse_callback)while True:cv2.imshow("drawshape",img)key=cv2.waitKey(1) & 0xff if key == ord('q'):breakelif key==ord('l'):#linecurshape=0elif key==ord('r'):#rectcurshape=1elif key==ord('c'):#circlecurshape=2

在这里插入图片描述

当把,函数外面的定义注释掉,也会报错,但是可以使用画图功能;

# #全局变量
# curshape=0
# startpos=(0,0)img=np.zeros((480,640,3),np.uint8)def mouse_callback(event,x,y,flag,userdata):global curshape,startpos#需要再次全局申明

: name ‘curshape’ is not defined

Traceback (most recent call last):File "e:\Program_Py\1.py", line 23, in mouse_callbackif curshape==0:
NameError: name 'curshape' is not defined

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

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

相关文章

微服务如何集成swagger3

文章目录引言一、项目结构二、顶级pom依赖准备三、common-swagger模块四、gateway模块配置五、结果演示引言 我们在用springboot开发应用时,经常使用swagger来作为我们的接口文档可视化工具,方便前端同事调用,集成也是比较简单的&#xff0c…

特种行业许可证识别技术:通过图像处理、OCR和结构化提取,实现高效、准确的许可证核验与管理

在酒店、娱乐场所、典当行、危化品经营等特种行业管理中,许可证是合法经营的“生命线”。传统人工核验方式效率低下、易出错,且难以应对海量数据和复杂伪造手段。特种行业许可证识别技术应运而生,成为智慧监管和优化服务的关键工具。特种行业…

零售行业新店网络零接触部署场景下,如何选择SDWAN

一家连锁超市在新疆偏远地区的新店开业申请网络专线,市政审批和架设电线杆的流程花了半个月,成本高企——而它的竞争对手在隔壁新店部署SD-WAN,从开箱到业务上线仅用了10分钟。近年来,零售企业疯狂扩张与下沉市场的趋势愈演愈烈。…

python发布文章和同步文章到社区的工具小脚本

在开发过程中,开发者们往往需要频繁地在社区中分享文章、解决方案以及技术文章来交流与成长。为了简化这一过程,我将为你们介绍两个基于Python脚本的自动化工具,可以帮助你发布文章到开发者社区,提高效率。一、从Markdown文件批量…

23.CNN系列网络思考

为什么是卷积、池化的交替进行? 卷积做的是特征提取,池化做的是一种降采样。 早期学习的主要是:低级特征(边缘、角点、纹理、颜色)。这些特征分布相对局部且空间位置信息很重要。 卷积将这些特征学习出来,然后通过池化降采样,突出其位置信息。然后再卷积进行学习池化后…

MySQL 8.x的性能优化文档整理

一、内存与缓冲优化 # InnoDB缓冲池(内存的60%-80%) innodb_buffer_pool_size 12G # 核心参数 innodb_buffer_pool_instances 8 # 8核CPU建议分8个实例# 日志缓冲区与Redo日志 innodb_log_buffer_size 256M # 事务日志缓冲区 innodb_log_…

个人使用AI开发的《PlSqlRewrite4GaussDB(PLSQL自动转换工具)1.0.1 BETA》发布

个人使用AI开发的《PlSqlRewrite4GaussDB(PLSQL自动转换工具)1.0.1 BETA》发布 前言 基于语法树的SQL自动改写工具开发系列(1)-离线安装语法树解析工具antlr4 基于语法树的SQL自动改写工具开发系列(2)-使用PYTHON进行简单SQL改写…

python的校园研招网系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持: 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具:Navicat/SQLyog等都可以 摘要&…

如何高效撰写AI领域学术论文——学习笔记

最开始写的时候最好仿照着顶会来写1. 标题(Title)​标题是论文的"门面",需要同时具备简洁性和信息量:采用"XX方法 for XXX任务"的标准格式,包含核心创新点和应用领域,避免使用模糊词汇,力求精准&a…

elasticsearch8.12.0安装分词

上篇说到,安装了es后正常运行es分词下载地址从 GitHub Release 下载(推荐) 👉 https://github.com/medcl/elasticsearch-analysis-ik/releases或https://release.infinilabs.com/analysis-ik/stable/安装:选择与你 ES …

强化学习算法分类与介绍(含权重更新公式)

强化学习算法种类丰富,可按学习目标(基于价值 / 基于策略 / 演员 - 评论家)、数据使用方式(在线 / 离线)、是否依赖环境模型(无模型 / 有模型)等维度分类。以下按核心逻辑梳理常见算法&#xff…

基于STM32F103单片机智能门禁热释人体感应报警设计

1 系统功能介绍 本设计基于 STM32F103C8T6 单片机,通过多种传感器、执行器以及通信模块实现智能门禁和安防报警功能。其主要功能是检测门外人员情况,结合环境光照强度判断是否需要照明,同时结合 GSM 模块在异常情况下发送报警信息&#xff0c…

imx6ull-驱动开发篇33——platform 平台驱动模型

目录 Linux 驱动的分离与分层 驱动的分隔与分离 驱动的分层 platform 平台驱动模型 platform 总线 bus_type 结构体 platform 总线 platform_match函数 platform 驱动 platform_driver 结构体 device_driver 结构体 platform_driver_register 函数 platform_drive…

Win/Linux笔记本合盖不睡眠设置指南

在 笔记本电脑上,当你合上屏幕时,默认系统可能会进入“睡眠”或“休眠”状态。如果你希望合上屏幕时系统继续正常运行(例如后台下载、运行程序、远程访问等),需要修改系统的电源设置。 一、以下是 Windows 10 / Windo…

(栈)Leetcode155最小栈+739每日温度

739. 每日温度 - 力扣(LeetCode) while要把stack的判断放在前面,否则stack[-1]可能报错 class Solution(object):def dailyTemperatures(self, temperatures):""":type temperatures: List[int]:rtype: List[int]""…

【NLP(01)】NLP(自然语言处理)基础

目录NLP基础一、基本概念1. 自然语言处理的基本介绍1.1 与语言相关的概念1.2 为什么使用NLP2. NLP的应用方向2.1 **自然语言理解**2.2 自然语言转换2.3 自然语言生成3. NLP基础概念4. NLP的发展历史5. NLP的基本流程二、NLP中的特征工程0. 引入1. 词向量2. 传统NLP中的特征工程…

Python工程师进阶学习道路分析

本文将分为以下几个核心部分: 心态与基础重塑:从“会用”到“精通”核心语言深度:窥探Python的奥秘编程范式与设计模式:写出优雅的代码并发与异步编程:释放多核时代的威力性能分析与优化:让代码飞起来深入…

IntelliJ IDEA中Maven的“Sync“与“Reload“详解:小白的避坑指南

在IntelliJ IDEA中使用Maven时,Sync All Maven Projects(同步)和 Reload All Maven Projects(重新加载)是两个最常用的操作按钮。它们看似相似,实则承担着完全不同的职责。本文将通过通俗易懂的对比和场景分…

网络地址的详细计算说明

IP地址分类与计算 IP地址分5类A类 :0开头,适用于大型网络 B类 :10开头,适用于中型网络 C类 :110开头,适用于小型网络 D类 :1110开头,用于组播 E类 : 1110开头&#xff0c…

人工智能驱动的现代电商前端开发:从基础到智能体验

引言:AI如何重塑电商体验电子商务行业正在经历一场人工智能革命。从个性化推荐到视觉搜索,从智能客服到预测分析,AI技术正在彻底改变用户与电商平台的交互方式。作为前端开发者,了解如何集成AI功能已成为必备技能。本文将带您深入…