【Opencv-Python 官方教程】4.鼠标事件-鼠标作为画刷

2024-08-28 23:08

本文主要是介绍【Opencv-Python 官方教程】4.鼠标事件-鼠标作为画刷,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本节目标

  • 学会处理Opencv中鼠标事件
  • 将会学到以下几个函数:cv2.setMouseCallback()

原文地址:Mouse as a Paint-Brush


Simple Demo

首先,我们将创建一个简单的小demo,通过在图像上双击鼠标然后在点击地点绘制一个圆。

我们需要创建一个鼠标的回调函数(callback),这个函数会鼠标事件触发的时候被调用。鼠标事件绑定到所有的鼠标操作上,如左键按下、右键按下、左键抬起、右键抬起、左键双击等等。系统可以捕获到发生鼠标事件的位置坐标,通过这个坐标我们可以做出相应的定位和处理(坐标以及事件类型都会以参数形式传递到回调函数中)。以下代码可以列出所有可用的事件。

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’]

创建鼠标回调函数必须以一种指定的格式。这里我们的回调函数仅在双击处画一个圆,代码如下

# -*- coding: utf-8 -*-
# @File    : 4_Mouse_as_Paint_Brush.py
# @Time    : 2018/5/26 0:00
# @Author  : hyfine
# @Contact : foreverfruit@126.com
# @Desc    : 捕捉鼠标事件import cv2
import numpy as np# 鼠标回调函数,双击画圆
def draw_circle(event, x, y, flags, param):bg = param['background']if event == cv2.EVENT_LBUTTONDBLCLK:cv2.circle(bg, (x, y), 100, (255, 0, 0), -1)# 背景图
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('circle')
cv2.setMouseCallback('circle', draw_circle, {'background': img})while(1):cv2.imshow('circle',img)# 按ESC退出if cv2.waitKey(20)==27:breakcv2.destroyAllWindows()

这里说明以下,原版代码中没有使用param参数,这里为了避免使用全局变量,通过param参数传递背景图对象。将param定义成一个字典类型的参数。

这里写图片描述


Advanced Demo

现在我们做一个稍微复杂一点的demo。我们需要画矩形和圆(具体画什么取决于我们拖拽鼠标的方式)。所以我们的callback中有两个部分,一个是画矩形,一个是画圆。这个demo有助于我们理解一些交互应用,如对象追踪,图像分割等。

# -*- coding: utf-8 -*-
# @File    : 4_MouseEvent_AdvancedDemo.py
# @Time    : 2018/5/26 0:49
# @Author  : hyfine
# @Contact : foreverfruit@126.com
# @Desc    : 根据鼠标拖拽方式画圆或矩形import cv2
import numpy as np# mouse event callback
def draw_callback(event, x, y, flags, param):global bg, drawing, mode, ix, iyif event == cv2.EVENT_LBUTTONDOWN:drawing = Trueix, iy = x, yelif event == cv2.EVENT_MOUSEMOVE:# 鼠标在移动if drawing == True:if mode == True:cv2.rectangle(bg, (ix, iy), (x, y), (0, 255, 0), -1)else:cv2.circle(bg, (x, y), 5, (0, 0, 255), -1)elif event == cv2.EVENT_LBUTTONUP:drawing = Falseif mode == True:cv2.rectangle(bg, (ix, iy), (x, y), (0, 255, 0), -1)else:cv2.circle(bg, (x, y), 5, (0, 0, 255), -1)if __name__ == '__main__':# 设立一个画图识,表示当前鼠标是否处于按下状态,按下则为True,此时在画图drawing = False# 画图模式,True表示画矩形,否则画圆mode = True# 鼠标按下的位置,起始点ix, iy = -1, -1bg = np.ones([512, 512, 3], np.uint8) * 255cv2.namedWindow('mouse')cv2.setMouseCallback('mouse', draw_callback)while (1):cv2.imshow('mouse', bg)k = cv2.waitKey(1)if k == ord('r'):mode = Trueelif k == ord('c'):mode = Falseelif k == 27:breakcv2.destroyAllWindows()

这里写图片描述

这篇关于【Opencv-Python 官方教程】4.鼠标事件-鼠标作为画刷的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116151

相关文章

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll