点击上方“AI搞事情”关注我们


一、回调函数

setMouseCallback(windowName, onMouse, param=None)

windowName:窗口名称
onMouse:鼠标响应处理函数
鼠标回调函数,该函数在鼠标事件发生时被调用。鼠标事件可以是与鼠标相关的任何操作,如左键向下,左键向上,左键双击等。它为我们提供了每个鼠标事件的坐标(x,y)。 通过这个事件和位置,我们可以做任何我们想做的事情。 通过以下代码,可以列出所有的鼠标事件。

「代码」

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_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  中间双击

二、应用

1. 应用一

创建了一个简单的应用程序,只要我们双击它就可以在图像上绘制一个圆圈。

「代码」

import numpy as np
import cv2# 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)# Create a black image, a window and bind the function to window
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)while True:cv2.imshow('image', img)if cv2.waitKey(20) & 0xFF == 27:break
cv2.destroyAllWindows()

2. 应用二

通过拖动鼠标绘制矩形或圆形(根据我们选择的模式),就像在绘图应用程序中一样。 所以我们的鼠标回调函数有两个部分,一个用于绘制矩形,另一个用于绘制圆形。在主循环中,设置键'm'设置键盘绑定进行矩形和圆之间切换。

「代码」

import numpy as np
import cv2drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1# mouse callback function
import numpy as np
import cv2drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1# mouse callback function
def draw_circle(event,x,y,flags,param):global ix,iy,drawing,modeif event == cv2.EVENT_LBUTTONDOWN:drawing = Trueix,iy = x,yelif event == cv2.EVENT_MOUSEMOVE:if drawing == True: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)elif event == cv2.EVENT_LBUTTONUP:drawing = Falseif 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 True:cv2.imshow('image',img)k = cv2.waitKey(1) & 0xFFif k == ord('m'):mode = not modeelif k == 27:breakcv2.destroyAllWindows()

长按二维码关注我们

有趣的灵魂在等你

【opencv系列05】OpenCV4.X鼠标回调函数相关推荐

  1. Python Opencv 实现鼠标事件(包含一个练习)——事件触发讲解·以及鼠标回调函数的实现

    文章目录 鼠标事件概述 鼠标事件发生的结构 鼠标回调函数的标准格式 opencv下包含的所有事件--包含flag和event(可以看一下,熟悉常见事件范围) 鼠标事件的实现函数 一个完整的鼠标事件由一 ...

  2. Opencv鼠标回调函数

    1.目的 读取一张图片,在该图片上截取一个ROI区域,将截取的图像在新窗口显示,并可以保存至工程目录下. 2.实现环境 C++.VS2017.opencv 3.回调函数原理 回调函数就是一个通过函数指 ...

  3. ROS开发系列(7)- 在回调函数中发布topic

    文章目录 1 实现方法 2 实现代码 3 运行结果 参考 1 实现方法 在ROS开发系列(6)- zed深度信息与datknet的boundingbox信息融合基础上进行的修改. 创建一个自定义消息类 ...

  4. 【opencv系列08】OpenCV4.X图像融合操作

    点击上方"AI搞事情"关注我们 图像叠加 add(src1, src2, dst=None, mask=None, dtype=None)函数或者numpy操作实现图像按位相加,若 ...

  5. 【opencv系列07】OpenCV4.X图像基本操作

    点击上方"AI搞事情"关注我们 一.像素操作 可以通过行列坐标访问像素值,对于BGR图,返回一个蓝色.绿色.红色通道的数组值,对于灰度图,仅返回相应的强度值. 代码 import ...

  6. OPENCV回调函数

    OPENCV回调函数 回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该 ...

  7. 【学习OpenCV4】在OpenCV中响应键盘与鼠标操作

    键盘与鼠标的响应 一.键盘的响应 1.1 基本知识 1.2 确定按键响应值 1.3 按键调节亮度 二.鼠标的响应 1.1 基本知识 1.2 示例程序 一.键盘的响应 1.1 基本知识   按键的读取只 ...

  8. python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框

    最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...

  9. opencv画框显示python_python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框...

    最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...

最新文章

  1. BJUI使用ajax异步表单提交时后台action要加@ResponseBody
  2. python正则表达匹配汉字
  3. 回文数的个数、杨辉三角
  4. fedora 不在sudoers文件中_COPR 仓库中 4 个很酷的新软件(2019.4) | Linux 中国
  5. 细学PHP 14 mysql-4
  6. mysql数据库作业_mysql数据库操作练习
  7. 20春计算机应用基础在线作业,19春学期《计算机应用基础》在线作业21.txt
  8. 《简明 Python 教程》笔记-----面向对象及系统相关
  9. Mac快速备忘录开启与关闭设置方法
  10. 130242014029-黄超强-实验一
  11. python实现逻辑回归牛顿法求参数_教程 | 如何通过牛顿法解决Logistic回归问题
  12. plsql下载安装及基本使用
  13. Beyond Compare 过期解决办法
  14. 安装Pure-ftpd
  15. day21、3 - 防火墙HA
  16. 微信小程序识别字符串中的手机号,手机号高亮显示,并且可以点击这个手机号,拨打电话?
  17. 太离谱了!一行Python代码写的游戏,我能这样玩一天!
  18. spring data jpa 与 jpa的区别
  19. linux文件权限的例子,Linux基础教程之linux文件权限深度解读
  20. MySQL 查询排名

热门文章

  1. mac安装nvm及换源及node安装切换
  2. gethostbyname()函数:通过域名获取IP地址
  3. 十年的老代码,你敢动?
  4. pythonsubprocess执行多条shell命令_python中subprocess批量执行linux命令
  5. 排队问题解题思路_高考文科数学是最“拉分”的!6种题型分析与10大解题方法...
  6. php文件在桌面删除不了图片吗,删除windows桌面上某个应用程序的图标,意味着什么...
  7. Python学习系列day1-python基础
  8. 汇编解析(2)-内存寻址之实模型平面模式(real mode flat mode)(2)
  9. 【时间序列】使用 Auto-TS 自动化时间序列预测
  10. 【数据竞赛】大规模数据调参用这个包就可以啦。