OpenCV处理鼠标事件

使用工具:Python3.5
涉及包:cv2
函数:cv2.setMouseCallback()

简单的程序,在图片上双击过的位置绘制一个圆圈
1.创建鼠标事件回调函数,当鼠标事件发生时就会被执行。
比如左键按下,松开,左键双击等。可以通过鼠标事件获得相对应的图片上的坐标,根据这些信息可以做想做的事。所有鼠标事件回调函数都有一个统一的格式,不同的地方是被调用后的功能。

cv2.setMouseCallback(windowName, onMouse [, userdata])

相关参数说明如下:

windowName:窗口的名字;
onMouse:鼠标响应函数,回调函数。
userdata:传给回调函数的参数

上面三个参数,最重要的是第二个,鼠标回调函数,该函数在鼠标事件发生时执行。

鼠标事件可以是与鼠标相关的任何内容,如左键点击,左键向上,右键点击等。

回调函数格式
上文提及的第二个参数,一般都会遵循下述函数原型,即 MouseCallback onMouse 的函数原型。

on_mouse(event, x, y, flags, param)

上述 on_mouse 可以为任意函数名,其它参数说明如下:

event 是 CV_EVENT_* 变量之一,CV_EVENT 见下表;
x 和 y 是鼠标在图像坐标系的坐标(不是窗口坐标系);
flags 是 CV_EVENT_FLAG 的组合;
param 是用户定义的传递到 setMouseCallback 函数调用的参数。
鼠标事件的种类可以通过下述代码获取。

import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
print(events)

输出下述内容:

['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON',
'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN',
'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL',
'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']

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 1 //左键拖曳
EVENT_FLAG_RBUTTON 2 //右键拖曳
EVENT_FLAG_MBUTTON 4 //中键拖曳
EVENT_FLAG_CTRLKEY 8 //(8~15)按 Ctrl 不放
EVENT_FLAG_SHIFTKEY 16 //(16~31)按 Shift 不放
EVENT_FLAG_ALTKEY 32 //(32~39)按 Alt 不放

编码环节
准备知识已经学习完毕,接下来是应用环节。

下述案例,实现在河北地图上进行画圆操作,左键按下实心圆,右键按下空心圆。

import cv2 as cv


# 编写回调函数
def draw_circle(event, x, y, flags, param):
    # 鼠标左键按下去,实心圆
    if event == cv.EVENT_LBUTTONDOWN:
        cv.circle(img, center=(x, y), radius=5,
                  color=(255, 0, 0), thickness=-1)
    # 鼠标右键按下去,空心圆
    elif event == cv.EVENT_RBUTTONDOWN:
        cv.circle(img, center=(x, y), radius=5,
                  color=(0, 255, 0), thickness=1)


img = cv.imread('hebei.jpg')

cv.namedWindow(winname='drawing')
cv.setMouseCallback('drawing', draw_circle)

while True:
    cv.imshow('drawing', img)
    # 按 q 键退出
    if cv.waitKey(1) & 0xFF == ord('q'):
        break

cv.destroyAllWindows()

————————————————
版权声明:本文为CSDN博主「梦想橡皮擦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hihell/article/details/112335340

全部评论

相关推荐

昨天 15:20
武汉大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务