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