详解OpenCV中简单的鼠标事件处理

目录
  • cv2.setMouseCallback函数语法
  • 回调函数

谈及鼠标事件,就是在触发鼠标按钮后程序所做出相应的反应,但是不影响程序的整个线程。这有些像异步处理。鼠标事件响应不会一直等着我们去按而后续程序不执行,这样会造成阻塞,而是在我们不按鼠标的时候程序也会正常进行,按的时候会调用鼠标的事件响应,这个过程就像程序一边正常运行一边等待鼠标响应。

为了将鼠标响应和操作画面进行绑定,我们要创建一个回调函数:

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()

结果:

到此这篇关于详解OpenCV中简单的鼠标事件处理的文章就介绍到这了,更多相关OpenCV鼠标事件处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python 基于opencv 实现一个鼠标绘图小程序

    需求 在画布上用鼠标画图,可以画圆或矩形,按m键在两种模式下切换.左键按下时开始画图,移动到哪儿画到哪儿,左键释放时结束画图. 实现思想 用鼠标画图:需要定义鼠标的回调函数mouse_event 画圆或矩形:需要定义一个画图的模式mode 左键单击.移动.释放:需要捕获三个不同的事件 开始画图,结束画图:需要定义一个画图的标记位drawing 实现代码 import cv2 as cv import numpy as np drawing = False # 是否开始画图 mode = True

  • opencv利用鼠标滑动画出多彩的形状

    今天没有继续学习新知识点,画出了一个随鼠标画出的 图形,知识点全都是之前学的,话不多说,先上图: 代码部分: // opencvMouse.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; #define WINDOW_NAME "[窗

  • python opencv鼠标事件实现画框圈定目标获取坐标信息

    本文实例为大家分享了python-opencv鼠标事件画框圈定目标的具体代码,供大家参考,具体内容如下 在视频/相机中,用鼠标画矩形框,圈定目标,从而获得鼠标的起始坐标点a.终止坐标点b # -*- coding: utf-8 -*- """ Created on Tue Dec 27 09:32:02 2016 @author: http://blog.csdn.net/lql0716 """ import cv2 import numpy a

  • Python OpenCV实现鼠标画框效果

    使用Python+OpenCV实现鼠标画框的代码,供大家参考,具体内容如下 # -*-coding: utf-8 -*- """ @Project: IntelligentManufacture @File : user_interaction.py @Author : panjq @E-mail : pan_jinquan@163.com @Date : 2019-02-21 15:03:18 """ # -*- coding: utf-8 -

  • opencv3/python 鼠标响应操作详解

    鼠标回调函数: def setMouseCallback( windowName, #窗口名称 onMouse, #鼠标响应处理函数 param=None) #处理函数的ID event鼠标事件: event: EVENT_LBUTTONDBLCLK = 7 左键双击 EVENT_LBUTTONDOWN = 1 左键点击 EVENT_LBUTTONUP = 4 左键释放 EVENT_MBUTTONDBLCLK = 9 中间释放 EVENT_MBUTTONDOWN = 3 中间点击 EVENT_M

  • python opencv鼠标画点之cv2.drawMarker()函数

    目录 前言 cv2.drawMarker()函数说明 参数说明 利用鼠标回调函数交互式画点 例1,简单的例子 例2,删除功能 总结 前言 这里所谓画点的意思是指在单一像素点上画一个标记符,而不是画小圆点.使用的函数是cv2.drawMarker(img, position, color, ...) 关于鼠标回调函数的说明可以参考:opencv-python的鼠标交互操作 cv2.drawMarker()函数说明 参数说明 导入cv2后,通过help(cv2.drawMarker)可以看到函数的帮

  • python opencv鼠标画矩形框之cv2.rectangle()函数

    目录 cv2.rectangle()函数说明 参数说明 利用鼠标回调函数交互式画矩形框 总结 关于鼠标回调函数的说明可以参考:opencv-python的鼠标交互操作 cv2.rectangle()函数说明 参数说明 导入cv2后,通过help(cv2.rectangle)可以看到函数的帮助文档如下: rectangle(...) rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img . @brief D

  • 详解OpenCV中简单的鼠标事件处理

    目录 cv2.setMouseCallback函数语法 回调函数 谈及鼠标事件,就是在触发鼠标按钮后程序所做出相应的反应,但是不影响程序的整个线程.这有些像异步处理.鼠标事件响应不会一直等着我们去按而后续程序不执行,这样会造成阻塞,而是在我们不按鼠标的时候程序也会正常进行,按的时候会调用鼠标的事件响应,这个过程就像程序一边正常运行一边等待鼠标响应. 为了将鼠标响应和操作画面进行绑定,我们要创建一个回调函数: cv2.setMouseCallback函数语法 cv2.setMouseCallbac

  • 一文详解Vue3中简单diff算法的实现

    目录 简单Diff算法 减少DOM操作 例子 结论 实现 DOM复用与key的作用 例子 虚拟节点的key 实现 找到需要移动的元素 探索节点顺序关系 实现 如何移动元素 例子 实现 添加新元素 例子 实现 移除不存在的元素 例子 实现 总结 简单Diff算法 核心Diff只关心新旧虚拟节点都存在一组子节点的情况 减少DOM操作 例子 // 旧节点 const oldVNode = { type: 'div', children: [ { type: 'p', children: '1' },

  • 详解opencv中画圆circle函数和椭圆ellipse函数

    1.      void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness = 1,   int lineType = LINE_8, int shift = 0); ellipse函数将椭圆画到图像 lmg 上, 椭圆中心为点center,并且大小位于矩形 axes

  • 图文详解OpenCV中光流以及视频特征点追踪

    目录 前言 1. 效果图 2. 原理 2.1 什么是光流?光流追踪的前提.原理 2.2 光流的应用 2.3 光流的2种方法 3. 源码 3.2 稀疏光流追踪 3.2 优化版稀疏光流追踪 3.3 密集光流追踪 总结 前言 这篇博客将介绍光流的概念以及如何使用 Lucas-Kanade 方法估计光流,并演示如何使用 cv2.calcOpticalFlowPyrLK() 来跟踪视频中的特征点. 1. 效果图 光流追踪效果图如下: 它显示了一个球在连续 5 帧中移动.箭头表示其位移矢量. 不是很严谨的-

  • 详解iOS中按钮点击事件处理方式

    写在前面 在iOS开发中,时常会用到按钮,通过按钮的点击来完成界面的跳转等功能.按钮事件的实现方式有多种,其中较为常用的是目标-动作对模式.但这种方式使得view与controller之间的耦合程度较高,不推荐使用: 另一种方式是代理方式,按钮的事件在view中绑定,controller作为view的代理实现代理方法. 目标-动作对实现方式 具体来说,假设我们有一个包含一个Button的veiw,view将Button放在头文件中,以便外部访问.然后controller将view作为自己的vie

  • 详解python中GPU版本的opencv常用方法介绍

    引言 本篇是以python的视角介绍相关的函数还有自我使用中的一些问题,本想在这篇之前总结一下opencv编译的全过程,但遇到了太多坑,暂时不太想回看做过的笔记,所以这里主要总结python下GPU版本的opencv. 主要函数说明 threshold():二值化,但要指定设定阈值 blendLinear():两幅图片的线形混合 calcHist() createBoxFilter ():创建一个规范化的2D框过滤器 canny边缘检测 createGaussianFilter():创建一个Ga

  • 详解Python中键盘鼠标的相关操作

    目录 一.前言 二.pyautogui模块 三.鼠标相关操作 1.鼠标移动 2.获取鼠标位置 3.鼠标点击 4.按松鼠标 5.拖动窗口 6.上下滑动 7.小程序——鼠标操控术2.0 8.小程序——连点器 四.键盘相关操作 1.按键的按松 2.键入字符串 3.热键 4.小程序——轰炸器 5.小程序——520个我爱你 五.尾声 一.前言 恭喜你,学明白类,你已经学会所有基本知识了. 这章算是一个娱乐篇,十分简单,了解一下pyautogui模块,这算是比较好学还趣味性十足的,而且可以做许多小程序. 本

  • 详解PyQt5中textBrowser显示print语句输出的简单方法

    开发python程序处理大数据量的时候,少不了使用print语句看看输出结果:长时间处理数据时用print输出处理进展情况.使用PyQt5开发了UI界面后,本能地想让已自己调试好的py代码中的print输出到UI的textBrowser中显示出来.在CSDN上查了不少结果,一般都是使用多线程.我对多线程研究不多,就采用了变通办法,效果还挺好. 在Ui界面程序(Ui_startaml.py)中设置textBrowser用于显示程序输出信息,并自己定义代码(def printf ),以后将.py程序

  • 详解Java中ThreadLocal类型及简单用法

    目录 1 基本概念 2 简单使用 3 应用场景 4 底层原理 4.1 set(Object) 4.2 get() 4.3 remove() 4.4 ThreadLocalMap 5 内存泄漏隐患和防止策略 5.1 为什么会发生内存泄漏? 5.2 怎样防止内存泄漏? 1 基本概念 ThreadLocal类提供了线程局部变量.这些变量与普通变量的不同之处在于,每个访问一个变量(通过其get或set方法)的线程都有自己的.独立初始化的变量副本.ThreadLocal实例通常是希望将状态与线程关联起来的

  • 详解Python中位运算的简单实现

    目录 简介 应用场景 案例源码 简介 程序中的数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在内存中对应的二进制位进行操作,一般是将数字化为二进制数后进行操作. 应用场景 在常规操作和位运算的操作中使用位运算,可以提升性能.但是会造成代码难以理解,建议合理利用. 1.统计奇数 2.统计偶数 3.统计不相同数等 4.求相反数 位运算分有6种: 1.按位与:两个位都为1时,结果才为1(统计奇数)即全1为1. 2.按位或:两个位都为0时,结果才为0(统计偶数)即全0为0. 3.按位异或

随机推荐