导入包
import cv2 import numpy as np可以通过下面的代码来查看所有的鼠标事件函数
events=[i for i in dir(cv2) if 'EVENT' in i]#查看所有鼠标事件 print(events) 输出为: ['EVENT_FLAG_ALTKEY', flags 代表拖拽事件。按住alt键不放 'EVENT_FLAG_CTRLKEY',按住ctrl键不放 'EVENT_FLAG_LBUTTON',按住左键拖拽 'EVENT_FLAG_MBUTTON',中键拖拽 'EVENT_FLAG_RBUTTON',右键拖拽 'EVENT_FLAG_SHIFTKEY',按住shift不放 'EVENT_LBUTTONDBLCLK', event鼠标事件。左键双击 'EVENT_LBUTTONDOWN',按下左键 'EVENT_LBUTTONUP',释放左键 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']创建回调函数。当双击鼠标左键时,自动出现圆
def draw_circle(event,x,y,flags,param):#创建回调函数,参数分别是:event鼠标事件,flags鼠标拖拽事件,x,y中心坐标 if event==cv2.EVENT_LBUTTONDBLCLK:#双击鼠标左键 cv2.circle(img,(x,y),100,(255,0,0),-1) img=np.zeros((512,512,3),np.uint8)#黑色画布,长宽都为512,3表示BGR3种颜色,uint8是用0-255表示所有颜色 cv2.namedWindow('image')#窗口命名 cv2.setMouseCallback('image',draw_circle)#用鼠标画 while(1): cv2.imshow('image',img) if cv2.waitKey(20)&0xFF==27:#。cv2.waitKey(delay)返回值: # 1、等待期间有按键:返回按键的ASCII码(比如:Esc的ASCII码为27); # 2、等待期间没有按键:返回 -1; break cv2.destroyAllWindows()拖动鼠标来画矩形或者圆
drawing=False mode=True ix,iy=-1,-1 def draw_circle(event,x,y,flags,param): global ix,iy,drawing,mode#定义全局变量 if event==cv2.EVENT_LBUTTONDOWN:#若按下左键,drawing 的状态变成TRUE drawing=True ix,iy=x,y elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:#若拖动左键, if drawing==True: if mode==True: cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)# (ix,iy),(x,y) # 当按下左键时就会将鼠标所在x,y的值赋给ix,iy作为矩形的左上角起始点,(x,y)终点坐标 else: # cv2.circle(img,(x,y),3,(0,0,255),-1)#画圆,拖动鼠标时会画很多连在一起的小圆 r = int(np.sqrt((x - ix) ** 2 + (y - iy) ** 2))#起始点是圆心,沿着半径方向拖动拉长半径 cv2.circle(img,(x,y),r,(0,0,255),-1) elif event==cv2.EVENT_LBUTTONUP:#松开左键时,drawing=False drawing==False if mode==True:#当没有执行上一个elif时,松开左键会画矩形, cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) else: cv2.circle(img, (x, y), 3, (0, 0, 255), -1) img=np.zeros((512,512,3),np.uint8) cv2.namedWindow('image') cv2.setMouseCallback('image',draw_circle) while(1): cv2.imshow('image',img) k=cv2.waitKey(1)&0xFF if k==ord('m'):#按'm'键来控制mode状态,每按一次就会将mode的状态变为与上一次相反,从而判断是画圆还是矩形 mode=not mode elif k==27:#ESC键退出 break用滑动条作调色板
def nothing(x): pass img=np.zeros((512,512,3),np.uint8) cv2.namedWindow('image') #创建滑动条 cv2.createTrackbar('R','image',0,255,nothing)# 参数1:滑动条轨迹名, 参数2:滑动条依附的窗口名 # 参数3:滑块的位置,创建时,滑块初始位置就是这个变量当前的值 参数4:轨迹的最大值, 参数5:回调函数 #在本例中这个回调函数不用做任何事情,我们只需要 pass 就可以了。 cv2.createTrackbar('G','image',0,255,nothing) cv2.createTrackbar('B','image',0,255,nothing) switch='0:OFF\n1:ON'#创建转换按钮,opencv不带转换按钮,所以用滑动条来代替,颜色区间值设为0和1,表示关和开 cv2.createTrackbar(switch,'image',0,1,nothing) while(1): cv2.imshow('image',img) k=cv2.waitKey(1)&0xFF if k==27: break r=cv2.getTrackbarPos('R','image') g=cv2.getTrackbarPos('G','image') b=cv2.getTrackbarPos('B', 'image') s=cv2.getTrackbarPos(switch,'image') if s==0: img[:]=0#s=0时,图像颜色0代表黑色 else: img[:]=[b,g,r] cv2.destroyAllWindows()将鼠标和滑动条结合起来,可以选择不同颜色的画笔绘制。
def nothing(x): pass drawing=False mode=True ix,iy=-1,-1 def draw_circle(event,x,y,flags,param): r = cv2.getTrackbarPos('R', 'image') g = cv2.getTrackbarPos('G', 'image') b = cv2.getTrackbarPos('B', 'image') # s=cv2.getTrackbarPos(switch,'image') color=(b,g,r) # switch = '0:OFF\n1:ON' # 创建转换按钮,opencv不带转换按钮,所以用滑动条来代替 # cv2.createTrackbar(switch, 'image', 0, 1, nothing) global ix,iy,drawing,mode#定义全局变量 if event==cv2.EVENT_LBUTTONDOWN:#若按下左键,drawing 的状态变成TRUE drawing=True ix,iy=x,y elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:#若拖动左键, if drawing==True: if mode==True: cv2.rectangle(img,(ix,iy),(x,y),color,-1)# (ix,iy),(x,y) # 当按下左键时就会将鼠标所在x,y的值赋给ix,iy作为矩形的左上角起始点,(x,y)终点坐标 else: # cv2.circle(img,(x,y),3,(0,0,255),-1)#画圆,拖动鼠标时会画很多连在一起的小圆 r = int(np.sqrt((x - ix) ** 2 + (y - iy) ** 2))#起始点是圆心,沿着半径方向拖动拉长半径 cv2.circle(img,(x,y),r,color,-1) elif event==cv2.EVENT_LBUTTONUP:#松开左键时,drawing=False drawing=False if mode==True:#当没有执行上一个elif时,松开左键会画矩形, cv2.rectangle(img,(ix,iy),(x,y),color,-1) else: cv2.circle(img, (x, y), 3, color, -1) img=np.zeros((512,512,3),np.uint8) cv2.namedWindow('image') #创建滑动条 cv2.createTrackbar('R','image',0,255,nothing)# 参数1:滑动条轨迹名, 参数2:滑动条依附的窗口名 # 参数3:滑块的位置,创建时,滑块初始位置就是这个变量当前的值 参数4:轨迹的最大值, 参数5:回调函数 #在本例中这个回调函数不用做任何事情,我们只需要 pass 就可以了。 cv2.createTrackbar('G','image',0,255,nothing) cv2.createTrackbar('B','image',0,255,nothing) # switch='0:OFF\n1:ON'#创建转换按钮,opencv不带转换按钮,所以用滑动条来代替 # cv2.createTrackbar(switch,'image',0,1,nothing) cv2.setMouseCallback('image',draw_circle) while(1): cv2.imshow('image',img) k=cv2.waitKey(1)&0xFF if k==ord('m'):#按'm'键来控制mode状态,每按一次就会将mode的状态变为与上一次相反,从而判断是画圆还是矩形 mode=not mode elif k==27:#ESC键退出 break