学习Opencv+Python之获取鼠标绘制图形

学习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):
......
  • 参数1 事件 event
  • 参数2 鼠标所处位置 (x, y)
  • 参数3 标记 flages
  • 参数4 自定义参数 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)

结果
学习Opencv+Python之获取鼠标绘制图形_第1张图片
注:图像中绘制文本函数cv.putText()
cv.putText(img, text, org, fontFace, fontScale, color[, lineType[, bottomLeftOrigin]]])

参数:

  1. img:背景图像
  2. text:文本内容
  3. org:文字的左下角位置
  4. fontFace:文字类型
  5. fontScale:文字大小
  6. color:文字颜色
  7. lineType:建议使用cv.LINE_AA能够得到锯齿较少的线段

你可能感兴趣的:(opencv,python)