1 鼠标回调函数
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键,即选择了画圆。此时,滑动鼠标即可画圆。
#全局变量
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,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')
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
global curshape,startpos
name ‘curshape’ is not defined
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
正确做法,在函数外面定义一次,在函数里面使用的时候,需要再次全局申明
#全局变量
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_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
#基本功能:
# 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
当把,函数外面的定义注释掉,也会报错,但是可以使用画图功能;
# #全局变量
# 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_callback
if curshape==0:
NameError: name 'curshape' is not defined