学习Opencv+Python之获取鼠标绘制图形
1、鼠标相应的相关操作
在Opencv中,将鼠标键位的点击操作称为“事件(event)”,常见的这些事件有:
EVENT_MOUSEMOVE 0 滑动
EVENT_LBUTTONDOWN 1 左键点击
EVENT_RBUTTONDOWN 2 右键点击
EVENT_MBUTTONDOWN 3 中键点击
EVENT_LBUTTONUP 4 左键放开
EVENT_RBUTTONUP 5 右键放开
EVENT_MBUTTONUP 6 中键放开
EVENT_LBUTTONDBLCLK 7 左键双击
EVENT_RBUTTONDBLCLK 8 右键双击
EVENT_MBUTTONDBLCLK 9 中键双击
将鼠标键位的拖拽以及键盘特殊案件的操作称为“标志(flags)”,常见的这些标志有:
EVENT_FLAG_LBUTTON 左键拖曳
EVENT_FLAG_RBUTTON 右键拖曳
EVENT_FLAG_MBUTTON 中键拖曳
EVENT_FLAG_CTRLKEY 按住Ctrl
EVENT_FLAG_SHIFTKEY 按住Shift
EVENT_FLAG_ALTKEY 按住Alt
2、回调函数
了解过鼠标事件之后,我们来看一下什么是回调函数即回头调用的函数,故应先设置函数,再调用它。
对于,回调函数格式一般固定,其参数为:
def func(event, x, y, flags, param):
......
3、示例1
###双击左键画圆###
###双击左键画圆###
import cv2 as cv
import numpy as np
# 设置函数,回调函数格式一般固定如下:
def draw_circle(event, x, y, flags, param):
# 如果双击鼠标左键,绘制半径为100,圆心为(x, y),线条为蓝色的填充圆
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img, (x, y), 100, (255, 0, 0), -1)
img = np.zeros((512, 512, 3), dtype=np.uint8)
cv.namedWindow('img')
# 回调
cv.setMouseCallback('img', draw_circle)
while(1):
cv.imshow('img', img)
if cv.waitKey(20) == 27:
break
cv.destroyAllWindows()
4、示例2
import cv2 as cv
import numpy as np
# 创建尺寸为230*640的白色背景
img = np.ones((320, 640, 3), np.uint8)*255
# 创建坐标位置变量,将鼠标获得位置信息保存在xys列表中
xys = []
# 创建回调函数
def draw(event, x, y, flag, param):
# 全局变量
global xys
# 设置字体
font = cv.FONT_HERSHEY_PLAIN
# 如果左键按下弹起后响应:绘制或者显示当前鼠标位置
if event == cv.EVENT_LBUTTONUP:
xy = '(%s, %s)'%(x, y)
# 显示当前位置信息
cv.putText(img, xy, (x, y), font, 2, (0, 0, 0), 1, cv.LINE_AA)
# 每次鼠标左键抬起后,在原有的位置列表xys中追加坐标,以便绘制多边形
xys.append([x, y])
# 鼠标左键抬起后,在当前位置绘制一个红色的实心点代表当前位置
cv.circle(img, (x,y), 5, (0,0,255), -1)
# 否则如果右键抬起后响应:绘制多边形
elif event == cv.EVENT_RBUTTONUP:
# 绘制图形时,顶点应该为darray数组
pts = np.array(xys, np.int32)
# 绘制多边形
cv.polylines(img, [pts], True, (255,0,0), 2)
xys = []
cv.imshow('drawing', img)
cv.namedWindow('drawing')
# 为窗口绑定回调函数
cv.setMouseCallback('drawing', draw)
cv.imshow('drawing', img)
cv.waitKey(0)
结果
注:图像中绘制文本函数cv.putText()
cv.putText(img, text, org, fontFace, fontScale, color[, lineType[, bottomLeftOrigin]]])
参数: