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

P18 3-10

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

1 鼠标回调函数




python 复制代码
import cv2
import numpy as np

def 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'):
        break

cv2.destroyAllWindows()

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

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

2.1 图形绘制教程

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

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

基本功能:

  • 1 画线:当按下l键,即选择了画线。此时,滑动鼠标即可画线。
  • 2 画矩形:当按下r键,即选择了画矩形。此时,滑动鼠标即可画矩形。
  • 3 画圆:当按下c键,即选择了画圆。此时,滑动鼠标即可画圆。
python 复制代码
#全局变量
curshape=0
startpos=(0,0)

img=np.zeros((480,640,3),np.uint8)
python 复制代码
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,y
        elif 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')
python 复制代码
 File "e:\Program_Py\1.py", line 25, in mouse_callback
    cv2.line(img,startpos,(x,y),(255,0,0))#起点startpos,终点是当前x,y
UnboundLocalError: local variable 'startpos' referenced before assignment

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

#全局变量

将全局变量前加上global

python 复制代码
 global curshape,startpos

name 'curshape' is not defined

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

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

python 复制代码
#全局变量
curshape=0
startpos=(0,0)

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

startpos=(x,y)

当获取点startpo中x值时,startpos.x,报错

python 复制代码
File "e:\Program_Py\1.py", line 29, in mouse_callback
    cv2.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

python 复制代码
#基本功能:
# 1 画线:当按下l键,即选择了画线。此时,滑动鼠标即可画线。
# 2 画矩形:当按下r键,即选择了画矩形。此时,滑动鼠标即可画矩形。
# 3 画圆:当按下c键,即选择了画圆。此时,滑动鼠标即可画圆。


#curshape:0-drawline,1-drawrectangle,2-drawcircle

import 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,y
        elif 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'):
        break
    elif key==ord('l'):#line
        curshape=0
    elif key==ord('r'):#rect
        curshape=1
    elif key==ord('c'):#circle
        curshape=2

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

python 复制代码
# #全局变量
# 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

python 复制代码
Traceback (most recent call last):
  File "e:\Program_Py\1.py", line 23, in mouse_callback
    if curshape==0:
NameError: name 'curshape' is not defined
相关推荐
ZZHow10245 分钟前
02OpenCV基本操作
python·opencv·计算机视觉
计算机学长felix16 分钟前
基于Django的“酒店推荐系统”设计与开发(源码+数据库+文档+PPT)
数据库·python·mysql·django·vue
站大爷IP17 分钟前
Python随机数函数全解析:5个核心工具的实战指南
python
悟乙己25 分钟前
使用 Python 中的强化学习最大化简单 RAG 性能
开发语言·python·agent·rag·n8n
max50060030 分钟前
图像处理:实现多图点重叠效果
开发语言·图像处理·人工智能·python·深度学习·音视频
AI原吾41 分钟前
玩转物联网只需十行代码,可它为何悄悄停止维护
python·物联网·hbmqtt
云动雨颤1 小时前
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
python·单元测试
SunnyDays10111 小时前
Python 实现 HTML 转 Word 和 PDF
python·html转word·html转pdf·html转docx·html转doc
跟橙姐学代码2 小时前
Python异常处理:告别程序崩溃,让代码更优雅!
前端·python·ipython
AI 嗯啦2 小时前
计算机视觉opencv----银行卡号码识别
人工智能·opencv·计算机视觉