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

【P18 3-10】OpenCV Python—— 鼠标控制,鼠标回调函数(鼠标移动、按下、。。。),鼠标绘制基本图形(直线、圆、矩形)

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.lryc.cn/news/624332.html

相关文章:

  • CVPR 2025|英伟达联合牛津大学提出面向3D医学成像的统一分割基础模型
  • rust 从入门到精通之变量和常量
  • 视觉语言导航(14)——VLN ON ROBOTIC 4.4
  • 多线程初阶-线程安全 (面试和工作的重点!!!)
  • Gartner发布2025年AI与网络安全成熟度曲线:用AI增强网络安全计划的27项技术与创新
  • 猫头虎AI分享|一款智能量化交易系统:QuantCell,从数据收集到策略执行全流程自动化
  • #Datawhale 组队学习#8月-工作流自动化n8n入门-1
  • 牛子图论进阶
  • ChatGPT-5 对教育行业的影响与案例研究
  • 【领码课堂】AI写码不再“盲跑”,方案先行,自动化高效落地
  • 【完整源码+数据集+部署教程】无人机目标检测系统源码和数据集:改进yolo11-efficientViT
  • MQTT(轻量级消息中间件)基本使用指南
  • lesson41:MySQL数据库进阶实战:视图、函数与存储引擎全解析
  • 大数据计算引擎(一)——Spark
  • 国产化Excel处理组件Spire.XLS教程:使用 C# 从数据库导出数据到 Excel(含 SQL 示例)
  • 利用DeepSeek辅助WPS电子表格ET格式分析
  • iOS 应用上架全流程实践,从开发内测到正式发布的多工具组合方案
  • C++ 是技术面试中的高频考察测点(基础知识)
  • 【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
  • Laravel中如何使用php-casbin
  • Effective C++ 条款48:认识模板元编程
  • ARM 架构简明教程学习笔记
  • 23.CNN系列网络思考
  • 科伦博泰:商业化引爆点已至,冲向Biopharma的“最后一公里”
  • 基于C语言实现的HRV分析方法 —— 与Kubios和MATLAB对比
  • C++11列表初始化 {}
  • 【数据可视化-92】使用 Pyecharts 绘制乡镇街道级地图:以安徽省黄山市休宁县为例(我的老家)
  • 【数据结构】深入理解双向链表:结构、实现与对比分析
  • 后台管理系统-6-vue3之mockjs模拟和axios请求数据
  • 国产!全志T113-i 双核Cortex-A7@1.2GHz 工业开发板—ARM + DSP、RISC-V核间通信开发案例