pygame判断鼠标左键_【鼠标绘图】——来自OpenCV图像处理的干货。

34f9e2e3c39cd4ea8ea85d3ac9aebba2.gif

Python+OpenCV教程1:简介与安装

Python+OpenCV教程2:基础元素-图片

Python+OpenCV教程3:打开摄像头

Python+OpenCV教程4:图像基本操作

Python+OpenCV教程5:颜色空间转换

Python+OpenCV教程6:阈值分割

Python+OpenCV教程7:图像几何变换

Python+OpenCV教程8:绘图功能

鼠标绘图

文章交代:

  • 绘图功能——学习如何用鼠标实时绘图。

推荐人群:

  • 初级入门、机器学习小白、技术爱好者

【图片可到文末?本节源码下载。】

0 1目标
  • 捕获鼠标事件

  • OpenCV函数:cv2.setMouseCallback()

e3d193de5c55b19fcd165e9e384699db.gif

02知道鼠标在哪儿

OpenCV中,我们需要创建一个鼠标的回调函数来获取鼠标当前的位置、当前的事件如左键按下/左键释放或是右键单击等等,然后执行相应的功能。

使用cv2.setMouseCallback()来创建鼠标的回调函数,比如我们在左键单击的时候,打印出当前鼠标的位置:

import cv2import numpy as np# 鼠标的回调函数def mouse_event(event, x, y, flags, param):    # 通过event判断具体是什么事件,这里是左键按下    if event == cv2.EVENT_LBUTTONDOWN:        print((x, y))        img = np.zeros((512, 512, 3), np.uint8)cv2.namedWindow('image')# 定义鼠标的回调函数cv2.setMouseCallback('image', mouse_event)while(True):    cv2.imshow('image', img)    # 按下ESC键退出    if cv2.waitKey(20) == 27:        break

上面的代码先定义鼠标的回调函数mouse_event(),然后在回调函数中判断是否是左键单击事件EVENT_LBUTTONDOWN,是的话就打印出坐标。需要注意的是,回调函数的参数格式是固定的,不要随意更改。

那除了左键单击之外,还有哪些事件呢?可以用下面的代码打印出来:

# 获取所有的事件events = [i for i in dir(cv2) if 'EVENT' in i]print(events)
03综合实例

现在我们来实现一个综合的例子,这个实例会帮助你理解图像交互的一些思想:

在图像上用鼠标画图,可以画圆或矩形,按m键在两种模式下切换。左键按下时开始画图,移动到哪儿画到哪儿,左键释放时结束画图。听上去很复杂,是吗?一步步来看:

  • 用鼠标画图:需要定义鼠标的回调函数mouse_event

  • 画圆或矩形:需要定义一个画图的模式mode

  • 左键单击、移动、释放:需要捕获三个不同的事件

  • 开始画图,结束画图:需要定义一个画图的标记位drawing

好,开始coding吧:

import cv2import numpy as npdrawing = False  # 是否开始画图mode = True  # True:画矩形,False:画圆start = (-1, -1)def mouse_event(event, x, y, flags, param):    global start, drawing, mode        # 左键按下:开始画图    if event == cv2.EVENT_LBUTTONDOWN:        drawing = True        start = (x, y)            # 鼠标移动,画图    elif event == cv2.EVENT_MOUSEMOVE:        if drawing:            if mode:                cv2.rectangle(img, start, (x, y), (0, 255, 0), 1)            else:                cv2.circle(img, (x, y), 5, (0, 0, 255), -1)                    # 左键释放:结束画图    elif event == cv2.EVENT_LBUTTONUP:        drawing = False        if mode:            cv2.rectangle(img, start, (x, y), (0, 255, 0), 1)        else:            cv2.circle(img, (x, y), 5, (0, 0, 255), -1)            img = np.zeros((512, 512, 3), np.uint8)cv2.namedWindow('image')cv2.setMouseCallback('image', mouse_event)while(True):    cv2.imshow('image', img)    # 按下m切换模式    if cv2.waitKey(1) == ord('m'):        mode = not mode    elif cv2.waitKey(1) == 27:        break
效果应该如下图所示:

81945bcd3abc37e2bd3401436961d4d0.png

04小结

要用鼠标绘图,需要用cv2.setMouseCallback()定义回调函数,然后在回调函数中根据不同的event事件,执行不同的功能。

练习

1.(选做)实现用鼠标画矩形,跟实例差不多,但只实时画一个,类似下面动图:

e3d193de5c55b19fcd165e9e384699db.gif2.(选做)做一个在白色面板上绘图的简单程序,可用滑动条调整颜色和笔刷大小。

引用

  • 本节源码 http://t.cn/EJ3P9fm

  • Mouse as a Paint-Brush http://t.cn/EJ3veYt

小天

有话说

91179198479118d3ce997d6fe1d68852.png

如果你也有想分享的干货,可以登录天池实验室(notebook),包括赛题的理解、数据分析及可视化、算法模型的分析以及一些核心的思路等内容。

小天会根据你分享内容的数量以及程度,给予丰富的神秘天池大礼以及粮票奖励。分享成功后你也可以通过下方钉钉群?主动联系我们的社区运营同学(钉钉号:doqclsn 或 yiwen1991)

4d06a76d9ac5a903d9d4b61cfe6cedd1.png

天池宝贝们有任何问题,可在戳“留言”评论或加入钉钉群留言,小天会认真倾听每一个你的建议!2e4669288c09e89b24b460a129236014.png

4f381de20ec6a50f2dc33c9232740ec1.gif 992c9ac569cd9ac0c3a6ba3de8beb7ae.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值