opencv-python教程学习系列5-处理鼠标事件
前言
opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍opencv-python处理鼠标事件,坚持学习,共同进步。
系列教程参照OpenCV-Python中文教程;
系统环境
系统:win_x64;
python版本:python3.5.2;
opencv版本:opencv3.3.1;
内容安排
1.知识点介绍;
2.测试代码;
具体内容
1.知识点介绍;
鼠标事件使用的包是cv2,函数主要是cv2.setMouseCallback()函数;
一般首先创建鼠标事件回调函数,当鼠标事件发生时就会被执行。
通过鼠标事件获得相对应图像的坐标执行对应的功能。
所有鼠标事件回调函数都有一个统一的格式,不同的是被调用之后的功能。
1.1 查看所有被支持的鼠标事件
1 2 3 | import cv2 events = [i for i in dir (cv2) if 'EVENT' in i] print (events) |
鼠标事件包括如下内容:
1 2 3 4 5 6 | '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' |
1.2 在鼠标双击位置绘制一个圆;
1)定义鼠标事件回调函数;
1 2 3 4 | # 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 ) |
2)将图像窗口与回调函数绑定;
1 | cv2.setMouseCallback( 'image' , draw_circle) |
1.3 根据选择的模式在拖动鼠标时绘制矩形,故回调函数包含两个部分;
1)回调函数绘图的步骤:step1,按下左键时记录起始位置坐标;step2,按下左键并移动时根据模式的选择绘制图形;step3,鼠标松开时停止绘图;
2)将回调函数和窗口绑定在一起,同时在循环中将‘m’键与模式转换绑定在一起;
具体代码可参考测试代码;
2. 测试代码;
2.1在图像双击位置画圆;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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(( 500 , 500 , 3 ), np.uint8) cv2.namedWindow( 'image' ) cv2.setMouseCallback( 'image' , draw_circle) while ( 1 ): cv2.imshow( 'image' , img) if cv2.waitKey( 1 )& 0xFF = = ord ( 'q' ): #按q键退出 break cv2.destroyAllWindows() |
2.2 选择不同的模式在拖动鼠标时绘制矩形;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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 ''' 下面把回调函数与OpenCV窗口绑定在一起,在主循环中将'm'键与模式转换绑定在一起 ''' img = np.zeros(( 500 , 500 , 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' ): break cv2.destroyAllWindows() |
参考
完
各美其美,美美与共,不和他人作比较,不对他人有期待,不批判他人,不钻牛角尖。
心正意诚,做自己该做的事情,做自己喜欢做的事情,安静做一枚有思想的技术媛。
版权声明,转载请注明出处:https://www.cnblogs.com/happyamyhope/
心正意诚,做自己该做的事情,做自己喜欢做的事情,安静做一枚有思想的技术媛。
版权声明,转载请注明出处:https://www.cnblogs.com/happyamyhope/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】