目录
前言
目标
函数详解
1、cv2.setMouseCallback()鼠标回调函数
2、鼠标事件简介
代码演示
编辑
应用演示
运行效果
参考
跟着官网学习才是基础入门的最佳选择,下文是opencv-python官网的学习记录及扩展!
学习函数cv2.setMouseCallback()并使用鼠标绘制不同图形(矩形、多边形等)。
cv2.setMouseCallback(windowName, onMouse, param=None)
windowName 窗体名称
onMouse 鼠标事件的回调函数
param 传递给回调函数的可选参数
查看所有被支持的鼠标事件
import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
print (events)
鼠标事件标志 MouseEventFlags
'EVENT_FLAG_ALTKEY' 表示按下 ALT 键.
'EVENT_FLAG_CTRLKEY' 表示按下 CTRL 键.
'EVENT_FLAG_SHIFTKEY' 表示按下 SHIFT 键.
'EVENT_FLAG_LBUTTON' 表示鼠标左键已按下.
'EVENT_FLAG_MBUTTON' 表示鼠标中键已按下.
'EVENT_FLAG_RBUTTON' 表示鼠标右键已按下.
鼠标事件类型 MouseEventTypes
'EVENT_LBUTTONDBLCLK' 表示双击鼠标左键.
'EVENT_LBUTTONDOWN' 表示按下鼠标左键.
'EVENT_LBUTTONUP' 表示释放鼠标左键.
'EVENT_MBUTTONDBLCLK' 表示双击鼠标中键.
'EVENT_MBUTTONDOWN' 表示按下鼠标中键.
'EVENT_MBUTTONUP' 表示释放鼠标中键.
'EVENT_MOUSEHWHEEL' 正值和负值分别表示向右和向左滚动.
'EVENT_MOUSEMOVE' 指示鼠标指针已移到窗口上.
'EVENT_MOUSEWHEEL' 正值和负值分别表示向前和向后滚动.
'EVENT_RBUTTONDBLCLK' 表示双击鼠标右键.
'EVENT_RBUTTONDOWN' 表示按下鼠标右键.
'EVENT_RBUTTONUP' 表示释放鼠标右键.
在图片上双击过的位置绘制一个圆,创建鼠标事件回调函数,当鼠标事件发生时就会被执行,
比如左键按下,松开,左键双击等。
可以通过鼠标事件获得相对应的图片上的坐标,根据这些信息可以做想做的事。
所有鼠标事件回调函数都有一个统一的格式,不同的地方是被调用后的功能。
import numpy as np
import cv2 as cv
# mouse callback function
def draw_circle(event,x,y,flags,param):
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img,(x,y),100,(255,0,0),-1)
# Create a black image, a window and bind the function to window
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:
break
cv.destroyAllWindows()
通过键盘按键‘m'切换绘图类型曲线或矩形,并使用鼠标绘制。
import cv2
import numpy as np
# 当鼠标按下时为True
drawing = False
# 如果mode为true时绘制矩形,按下'm'变成绘制曲线
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
ix, iy = x, y
# 当左键按下并移动时绘制图形,event可以查看移动,flag查看是否按下
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)
else:
# 绘制圆圈,小圆点连在一起就成了线,3代表笔画的粗细
cv2.circle(img, (x, y), 3, (0, 0, 255), -1)
# 当鼠标松开时停止绘图
elif event == cv2.EVENT_LBUTTONUP:
drawing == False
print(ix, iy, x, y)
'''
下面把回调函数与OpenCV窗口绑定在一起,在主循环中奖'm'键与模式转换绑定在一起
'''
img = cv2.imread('../Resources/lena.png')#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)
if k == ord('m'):
mode = not mode
elif k == ord('q') or k == 27:
break
cv2.destroyAllWindows()
下图为代码运行效果,通过鼠标在图像上绘制矩形和曲线
OpenCV: OpenCV-Python Tutorials
学习、进步、坚持。。。内容不间断更新中。。。