鼠标处理事件:cv2.setMouseCallback()
# 1、event:其中event表示事件,回调过程中发生的是鼠标按下或放开、移动等操作。
# 2、x,y:表示鼠标此刻的在窗口中的位置信息。
# 3、flags:表示拖拽、组合键等标志,与event搭配使用
# 4、param:表示传入或传出的数据
# 5、EVENT_LBUTTONDBLCLK:左键双击
1 import cv2 2 # 查看所有被支持的鼠标事件,所有的鼠标事件回调函数都有个统一的格式,不同的只是被调用后的功能 3 events = [i for i in dir(cv2) if 'EVENT' in i] 4 print(events) 5 6 # 在双击过的地方绘制一个圆 7 import cv2 8 import numpy as np 9 def draw_circle(event,x,y,flags,param): 10 if event==cv2.EVENT_LBUTTONDBLCLK: 11 cv2.circle(img,(x,y),100,(255,0,0),-1) 12 # 创建图像和窗口 并将窗口和回调函数绑定 13 img=np.zeros((512,512,3),np.uint8) 14 cv2.namedWindow('image') 15 cv2.setMouseCallback('image',draw_circle) 16 while(True): 17 cv2.imshow('image',img) 18 if cv2.waitKey(20)&0xFF==27: 19 break 20 cv2.destroyAllWindows()
练习:绘制一个圆或矩形
1 # 依据选择的模式在拖动鼠标是绘制矩形或者圆圈, 2 import numpy as np 3 import cv2 4 # 当鼠标按下时变为True 5 drawing=False 6 # 如果 mode 为 true 绘制矩形,按下‘m’变成绘制曲线 7 mode=True 8 ix,iy=-1,-1 9 # 创建回调函数 10 def draw_circle(event,x,y,flags,param): 11 global ix,iy,drawing,mode 12 # 当按下左键是返回起始位置坐标 13 if event==cv2.EVENT_LBUTTONDOWN: 14 drawing=True 15 ix,iy=x,y 16 # 当鼠标左键按下并移动是绘制图形,event可以查看移动,查看是否按下 17 elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON: 18 if drawing==True: 19 if mode==True: 20 cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) 21 else: 22 # 绘制圆圈,小圆点连在一起就沉了线,2代表了壁画的粗细 23 cv2.circle(img,(x,y),3,(0,0,255),-1) 24 # 下面注释掉的代码是起始点为圆心,起点到终点为半径的 25 # r=int(np.sqrt((x-ix)**2-(y-iy)**2)) 26 # cv2.circle(img,(x,y),r,(0,0,255),-1) 27 # 当鼠标松开停止你绘画 28 elif event==cv2.EVENT_LBUTTONUP: 29 drawing==False 30 31 img=np.zeros((512,512,3),np.uint8) 32 cv2.namedWindow('image') 33 cv2.setMouseCallback('image',draw_circle) 34 while(1): 35 cv2.imshow('image',img) 36 k=cv2.waitKey(1)&0xff 37 if k==ord('m'): 38 mode=not mode 39 elif k==27: 40 break