详解OpenCV中简单的鼠标事件处理
作者:代码骑士 发布时间:2023-01-04 12:16:01
谈及鼠标事件,就是在触发鼠标按钮后程序所做出相应的反应,但是不影响程序的整个线程。这有些像异步处理。鼠标事件响应不会一直等着我们去按而后续程序不执行,这样会造成阻塞,而是在我们不按鼠标的时候程序也会正常进行,按的时候会调用鼠标的事件响应,这个过程就像程序一边正常运行一边等待鼠标响应。
为了将鼠标响应和操作画面进行绑定,我们要创建一个回调函数:
cv2.setMouseCallback函数语法
cv2.setMouseCallback(img,onMouse)
cv2.setMouseCallback函数参数解释:
img
:要绑定画面的名字
onMouse
:响应函数,即当鼠标事件触发时调用的函数。
示例代码:
cv2.setMouseCallback('image',draw_circle)
举个例子:
当我们在画面内单击的时候,会回调draw_circle函数,而这个被调用的函数成为响应函数,它的作用是画一个圆。调用这个函数后,我们就实现了画面与回调函数的绑定。
011-2-鼠标事件
查看所有被支持的鼠标事件:
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']
回调函数
在OpenCV中没有特定的写好的回调函数供我们直接使用,这需要我们自己编写,回调函数的模板如下:
def draw_circle(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),100,(255,0,0),-1)
函数分析:
代码第一行:是我们设置的函数名draw_circle以及它的参数,第一个参数event表示在什么事件下调用这个函数,x ,y可以理解为图像中鼠标指针所在的像素点的坐标值,后面两个参数暂时不用理解。
代码第二行:是事件的判定,如果发出了该事件,那么执行第三行的代码。
下面我们来通过双击鼠标左键画一个圆:
import cv2
import numpy as np
#设置回调函数
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'):
break
cv2.destroyAllWindows()
结果:
在通过拖动鼠标画一个矩形:
import cv2
import numpy as np
#按下鼠标时为True
drawing = False
#当mode为true时绘制矩形,按下m后mode变成false,用来绘制曲线
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,255,0),-1)
#当松开鼠标时停止绘制
elif event == cv2.EVENT_LBUTTONUP:
drawing ==False
#创建图像与窗口并将窗口与回调函数进行绑定
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
elif k == ord('r'):
img = np.zeros((500,500,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
cv2.destroyAllWindows()
结果:
来源:https://blog.csdn.net/qq_51701007/article/details/122403960


猜你喜欢
- 本文实例讲述了Python Django模板之模板过滤器与自定义模板过滤器。分享给大家供大家参考,具体如下:模板过滤器过滤器用于对模板变量进
- 本文实例讲述了Python通过PIL获取图片主要颜色并和颜色库进行对比的方法。分享给大家供大家参考。具体分析如下:这段代码主要用来从图片提取
- 本文实例讲述了PHP实现的DES加密解密类定义与用法。分享给大家供大家参考,具体如下:今天写App接口的时候需要传递加密数据给APP端,于是
- Python中if __name__ == ‘__main__‘作用要搞清楚这个问题,要知道以py作
- tell()方法返回的文件内的文件读/写指针的当前位置。语法以下是tell()方法的语法:fileObject.tell()参数
- 用下列方法可以做到: main.htm<html><body><form action="
- 本文实例讲述了Java常用正则表达式验证类。分享给大家供大家参考,具体如下:package com.fsti.icop.util.regex
- 像素误差看自己设计好上线的网站,偶尔会发觉像素行间出现了弹性空间,总在不经意间蹦出一定的差距。有些页面很难发现,比如活动类页面,这类页面多呈
- 今天知数堂一个学生反馈说在优化课中老师讲Innodb是以主键排序存储,读取的时间以主键为顺序读取,但发现个例外,如下:CREATE TABL
- 一,前言今天做的东西,还算可以,修改了若干个bug,自己又写成功的写了几个bug。增加了一个功能——
- 这篇文章主要介绍了Python 切分数组实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以
- 从控制台输入要出的拳 —— 剪刀(0)/石头(1)/布(2) 电脑 **随机*
- 先贴出完整代码. <script type="text/javascript"> function Stri
- TTS简介TTS(Text To Speech)是一种语音合成技术,可以让机器将输入文本以语音的方式播放出来,实现机器说话的效果。TTS分成
- ASP.NET Core必须包含Startup类。它就像 Global.asax 文件,我们传统的 .NET 应用程序。如名称建议的那样,在
- 建立池连接可以显著提高应用程序的性能和可缩放性。SQL Server .NET Framework 数据提供程序自动为 ADO.NET 客户
- 为什么需要对参数进行编码?相信有过开发的经验的广大程序员都知道,在Web中,若是直接在Url地址上传递参数值,若是中文,或者+等什么的就会出
- 最近写程序需要从文件中读取数据,并把读取的数据转换成向量。查阅资料之后找到了读取csv文件和txt文件两种方式,下面结合自己的实验过程,做简
- 1. 引言在Python开发中,itertools库经常被忽视,实际上该库中抱恨了一些非常棒的函数,特别是用于处于数据流的函数。在本文中,我
- file->setting->project->project interperter双击右侧出现的pip,弹出安装包,搜