点击上方“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. 中国拖拉机市场情况分析与发展趋势预测分析报告2022-2028年版
  2. mysql约束sex_MySQL笔记--约束
  3. Windows安装及使用sqlmap
  4. html5游戏 dice掷骰子,使用jQuery实现掷骰子游戏
  5. 怎么用程序实现调用Android手机的拍照功能
  6. Spring Boot相关
  7. 洛谷——P2433 【深基1-2】小学数学 N 合一
  8. C#操作excel(NPOI篇)
  9. android实现Materia Design风格APP(五):RecyclerView自定义item动画和共享元素动画
  10. 不显示BOM清单的版本
  11. 【Python入门教程】第35篇 查找元素的位置
  12. c语言输出字母空心菱形,C语言实现打印菱形和空心菱形
  13. 记一次 unicode-escape 和 utf-8 编码的互解
  14. D3.jsV5入门教程
  15. Hive中如何统计用户三个月或者以上的行为数据
  16. gnuplot软件学习笔记
  17. 取消 window 7 激活提示
  18. 连花清瘟对德尔塔病毒有效?这次网友反应不太一样
  19. SSM框架优缺点和springboot 比起优缺点是什么?
  20. setInterval使用过程中报Uncaught SyntaxError: Unexpected identifier

热门文章

  1. matlab小波三维图,matlab小波包变换估计时变功率谱三维图出图和理想不一样
  2. VC导入导出二维数组到 .txt
  3. Win32 串口编程(二)
  4. linux开机启动rsync,【Linux】rsync同步文件 程序自启动
  5. Python 网络爬虫笔记8 -- 股票数据定向爬虫
  6. c++17(24)-枚举与switch
  7. 【Python 】绘制惊艳的桑基图
  8. 全球首届“AI球球大作战:Go-Bigger多智能体决策智能挑战赛”开启
  9. 【CV】YOLO算法最全综述:从YOLOv1到YOLOv5
  10. 【科普】什么是 “内卷化效应” ?