【跟官网学opencv-python】笔记1.3:opencv鼠标绘图 cv2.setMouseCallback()

目录

前言

目标

函数详解

1、cv2.setMouseCallback()鼠标回调函数

2、鼠标事件简介

代码演示

​编辑

应用演示

运行效果

参考


前言

跟着官网学习才是基础入门的最佳选择,下文是opencv-python官网的学习记录及扩展!

目标

学习函数cv2.setMouseCallback()并使用鼠标绘制不同图形(矩形、多边形等)。

函数详解

1、cv2.setMouseCallback()鼠标回调函数

cv2.setMouseCallback(windowName, onMouse, param=None)
windowName  窗体名称
onMouse  鼠标事件的回调函数
param    传递给回调函数的可选参数

2、鼠标事件简介

查看所有被支持的鼠标事件
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()

【跟官网学opencv-python】笔记1.3:opencv鼠标绘图 cv2.setMouseCallback()_第1张图片

 

应用演示

通过键盘按键‘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-python】笔记1.3:opencv鼠标绘图 cv2.setMouseCallback()_第2张图片

 

参考

OpenCV: OpenCV-Python Tutorials

学习、进步、坚持。。。内容不间断更新中。。。

你可能感兴趣的:(OpenCV-Python,opencv,python,计算机视觉)