OpenCV-Python 中文教程3——把鼠标当画笔
目标
• 学习使用 OpenCV 处理鼠标事件
• 你将要学习的函数是: cv2.setMouseCallback()
1、简单演示
这里我们来创建一个简单的程序,他会在图片上你双击过的位置绘制一个圆圈。首先我们来创建一个鼠标事件回调函数,但鼠标事件发生是他就会被执行。鼠标事件可以是鼠标上的任何动作,比如左键按下,左键松开,左键双击等。我们可以通过鼠标事件获得与鼠标对应的图片上的坐标。根据这些信息我们可以做任何我们想做的事。你可以通过执行下列代码查看所有被支持的鼠标事件。
import cv2
events=[i for i in dir(cv2) if 'EVENT'in i]
print (events)
所有的鼠标事件回调函数都有一个统一的格式,他们所不同的地方仅仅是被调用后的功能。我们的鼠标事件回调函数只用做一件事:在双击过的地方绘制一个圆圈。下面是代码,不懂的地方可以看看注释。
import cv2
import numpy as np
#mouse callback function
def draw_circle(event,x,y,flags,param):if event==cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img,(x,y),100,(255,0,0),-1)# 创建图像与窗口并将窗口与回调函数绑定
img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)while(1):cv2.imshow('image',img)if cv2.waitKey(20)&0xFF==27:break
cv2.destroyAllWindows()
现在我们来创建一个更好的程序。这次我们的程序要完成的任务是根据我们选择的模式在拖动鼠标时绘制矩形或者是圆圈(就像画图程序中一样)。所以我们的回调函数包含两部分,一部分画矩形,一部分画圆圈。这是一个典型的例子他可以帮助我们更好理解与构建人机交互式程序,比如物体跟踪,图像分割等。
下面我们要把这个回调函数与 OpenCV 窗口绑定在一起。在主循环中我们需要将键盘上的“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=Trueix,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)# 下面注释掉的代码是起始点为圆心,起点到终点为半径的# r=int(np.sqrt((x-ix)**2+(y-iy)**2))
# cv2.circle(img,(x,y),r,(0,0,255),-1)
# 当鼠标松开停止绘画。elif event==cv2.EVENT_LBUTTONUP:drawing==False# if mode==True:# cv2.rectangle(img,(ix,iy),(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',draw_circle)
while(1):cv2.imshow('image',img)k=cv2.waitKey(1)&0xFFif k==ord('m'):mode=not modeelif k==27:break
运行结果为:
OpenCV-Python 中文教程3——把鼠标当画笔相关推荐
- Opencv笔记(五)——把鼠标当画笔
学习目标: 学习使用 OpenCV 处理鼠标事件 学会使用函数cv2.setMouseCallback() 简单演示: 首先我们来创建一个鼠标事件回调函数,但鼠标事件发生是他就会被执 ...
- python opencv用法中文教程
https://www.cnblogs.com/Undo-self-blog/p/8423851.html
- python中文教程github_GitHub - Virile-Tao/python_data_structures_and_algorithms: Python 中文数据结构和算法教程...
Python 算法与数据结构视频教程 课程简介 数据结构和算法是每个程序员需要掌握的基础知识之一,也是面试中跨不过的槛.目前关于 Python 算法和数据结构的系统中文资料比较欠缺, 笔者尝试录制视频 ...
- python 图像无缝拼接,OpenCV Python 系列教程3 - Core 组件
基本知识 灰度图像的存储方式: image 多通道图像存储方式 image OpenCV 中的通道存储为 BGR 像素值的存储方式 RGB 模式,显示设备采用这种模式 HSV.HLS 将颜色分解成色调 ...
- JavaTPoint Python 中文教程【翻译完成】
原文:JavaTPoint 协议:CC BY-NC-SA 4.0 阶段:机翻(1) 危机只有发展到最困难的阶段,才有可能倒逼出有效的解决方案.--<两次全球大危机的比较研究> 在线阅读 在 ...
- python中文教程-中谷python中文视频教程(全38集)
python在线教学视频教程共40节,中谷教育录制,主要介绍了python编程方面的知识. python在线教学-01-走进python python在线教学-02-开始编程吧 python在线教学- ...
- OpenCV中的 Gui特性-把鼠标作为画笔
目标: 学习用OpenCV控制鼠标事件 学习以下函数:cv.setMouseCallback() 一个简单的示例 这里我们来创建一个简单的程序,他会在图片上你双击的位置绘制一个圆圈.首先我们来创建一个 ...
- python编码读法-python中文读法
广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 而python是测试过程中最为常用的语言之一,很多测试团队的自动化代码和用例都是使 ...
- python在线发音-python中文读法
广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 而python是测试过程中最为常用的语言之一,很多测试团队的自动化代码和用例都是使 ...
最新文章
- Broadcast源码分析
- 为Apache动态增加模块
- VC++ 利用PDB和dump文件定位问题并进行调试
- 全球及中国素食宠物食品行业产销需求与销售渠道咨询报告2022版
- cpu 内存占用比较高的解决方案
- RabbitMQ系列-顺序消费模式和迅速消息发送模式
- UITabBarController使用总结
- PaddlePaddle预训练模型大合集
- mysql buffer 命中率_从MySQL的源码剖析Innodb buffer的命中率计算
- jquery 键盘事件
- JDK1.8源码下载及获取、导入IDEA阅读、配置JDK源码
- MongoDB之 写安全(Write Concern)
- PHP截取UTF-8字符串,解决半字符问题
- MSSQLSERVER数据库- 使用C#来操作事务[转]
- 怎么用jquery实现全选_经济薄弱,该怎么实现花园梦?用这些替代物降低养花成本...
- vs没有添加引用_英超:切尔西 vs 热刺,热刺准备重新登顶领头羊
- Hibernate配置JNDI数据源
- 晶体管放大电路基础——共射放大电路分析
- 马氏距离Mahalanobis Distance实例
- 猫盘plus开启ssh登录