鼠标事件
鼠标事件
# 使用鼠标作为画笔
# 列出cv中所有含'EVENT'的函数-----鼠标事件
events = [i for i in dir(cv) if 'EVENT' in i]
print(events)
将窗口与鼠标事件绑定
cv2.setMouseCallback(windowName, MouseCallback, param=None)
# windowName:窗口名称
# MouseCallback:鼠标响应回调函数
# param:响应函数传递的的参数
鼠标响应回调函数
# 鼠标回调函数
MouseCallback (event, x, y, flags, *userdata)
'''
event:一个MouseEventTypes 常
x:鼠标的x坐标
y:鼠标的y坐标
flags:一个MouseEventFlags常量
userdata:可选参数
MouseEventFlags :
cv.EVENT_FLAG_LBUTTON = 1, 左键拖拽
cv.EVENT_FLAG_RBUTTON = 2, 右键拖拽
cv.EVENT_FLAG_MBUTTON = 4, 中键不放
cv.EVENT_FLAG_CTRLKEY = 8,按住ctrl不放
cv.EVENT_FLAG_SHIFTKEY = 16, 按住shift不放
cv.EVENT_FLAG_ALTKEY = 32 ,按住alt不放
cv.MouseEventTypes :
cv.EVENT_MOUSEMOVE = 0, 鼠标移动
cv.EVENT_LBUTTONDOWN = 1, 左键按下
cv.EVENT_RBUTTONDOWN = 2, 右键按下
cv.EVENT_MBUTTONDOWN = 3, 中键按下
cv.EVENT_LBUTTONUP = 4, 左键释放
cv.EVENT_RBUTTONUP = 5, 右键释放
cv.EVENT_MBUTTONUP = 6, 中键释放
cv.EVENT_LBUTTONDBLCLK = 7, 左键双击
cv.EVENT_RBUTTONDBLCLK = 8, 右键双击
cv.EVENT_MBUTTONDBLCLK = 9, 中健双击
cv.EVENT_MOUSEWHEEL = 10, 滚轮滑动
cv.EVENT_MOUSEHWHEEL = 11 横向滚轮滑动
'''
实例
在鼠标双击的地方画一个圆
def test5():
# 使用鼠标作为画笔
# 列出cv中所有含'EVENT'的函数
events = [i for i in dir(cv) if 'EVENT' in i]
print(events)
# 鼠标回调函数,在鼠标双击的地方画一个圆
def draw_circle(event, x, y, flags, param):
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img, (x, y), 100, (255, 0, 0), -1)
# 创建一个黑色的图像,一个窗口,并绑定到窗口的功能
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw_circle) # 将窗口与鼠标事件绑定
while 1:
cv.imshow('image', img)
if cv.waitKey(20) & 0xFF == 27: # 计算机中整数以补码形式存储,ESC的ASCLL码值为27
break
cv.destroyAllWindows()
if __name__ == '__main__':
test5()
按下鼠标左键后,再按m画圆形;按下鼠标左键后,按下r画矩形
drawing = False # 如果按下鼠标,则为真
mode = True # 如果为真,绘制矩形。按 m 键可以切换到曲线
ix, iy = -1, -1
# 鼠标回调函数
def draw_circle01(event, x, y, flags, param):
global ix, iy, drawing, mode
if cv.waitKey(1) == ord('m'): # 按下鼠标左键后,再按m画圆形
mode = False
if cv.waitKey(1) == ord('r'): # 按下鼠标左键后,按下r画矩形
mode = True
if event == cv.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv.EVENT_MOUSEMOVE:
if drawing:
if mode:
cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv.circle(img, (x, y), 5, (0, 0, 255), -1)
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode:
cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv.circle(img, (x, y), 5, (0, 0, 255), -1)
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image', draw_circle01) # 将窗口与鼠标事件绑定
while 1:
cv.imshow('image', img)
if cv.waitKey(20) & 0xFF == 27: # 计算机中整数以补码形式存储,ESC的ASCLL码值为27
break
cv.destroyAllWindows()
学习参考链接来自少灬儿郎