opencv进阶03-图像与鼠标的交互示例

news2024/11/26 12:47:55

在处理图像时,可能需要与当前正在处理的图像进行交互。OpenCV
提供了鼠标事件,使用户可以通过鼠标与图像交互。鼠标事件能够识别常用的鼠标操作,例如:针对不同按键的单击、双击,鼠标的滑动、拖曳等。

例如,用户单击鼠标,我们就画一个圆。通常的做法是,创建一个 OnMouseAction()响应函数,将要实现的操作写在该响应函数
内。响应函数是按照固定的格式创建的,其格式为:

def OnMouseAction(event,x,y,flags,param):

式中:

  • event 表示触发了何种事件,具体事件如表 19-3 所示。
  • x, y 代表触发鼠标事件时,鼠标在窗口中的坐标(x, y)。
  • flags 代表鼠标的拖曳事件,以及键盘鼠标联合事件,如表 19-4 所示。
  • param 为函数 ID,标识所响应的事件函数,相当于自定义一个 OnMouseAction()函数的ID。
  • OnMouseAction 为响应函数的名称,该名称可以自定义。

在这里插入图片描述
在这里插入图片描述
定义响应函数以后,要将该函数与一个特定的窗口建立联系(绑定),让该窗口内的鼠标触发事件时,能够找到该响应函数并执行。要将函数与窗 口绑定,可以通过 函 数cv2.setMouseCallback()实现,其基本语法格式是:

cv2.setMouseCallback(winname,onMouse)

式中:

  • winname 为绑定的窗口名。
  • onMouse 为绑定的响应函数名。

设计一个程序,对触发的鼠标事件进行判断。

import cv2
import numpy as np
def Demo(event,x,y,flags,param):
 if event == cv2.EVENT_LBUTTONDOWN:
  print("单击了鼠标左键")
 elif event==cv2.EVENT_RBUTTONDOWN :
  print("单击了鼠标右键")
 elif flags==cv2.EVENT_FLAG_LBUTTON:
  print("按住左键拖动了鼠标")
 elif event==cv2.EVENT_MBUTTONDOWN :
  print("单击了中间键")
# 创建名称为 Demo 的响应(回调)函数 OnMouseAction
# 将响应函数 Demo 与窗口“Demo19.9”建立连接(实现绑定)
img = np.ones((300,300,3),np.uint8)*255
cv2.namedWindow('jiaohu01')
cv2.setMouseCallback('jiaohu01',Demo)
cv2.imshow('jiaohu01',img)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述

说明:可以通过下面的方法查看 OpenCV 所支持的鼠标事件:

import cv2
events=[i for i in dir(cv2) if 'EVENT'in i]
print(events)

滚动条

滚动条(Trackbar)在 OpenCV 中是非常方便的交互工具,它依附于特定的窗口而存在。
通过调节滚动条能够设置、获取指定范围内的特定值。
在 OpenCV 中,函数 cv2.createTrackbar()用来定义滚动条,其语法格式为:

cv2.createTrackbar(trackbarname, winname, value, count, onChange)

式中:

  • trackbarname 为滚动条的名称。
  • winname 为滚动条所依附窗口的名称。
  • value 为初始值,该值决定滚动条中滑块的位置。
  • count 为滚动条的最大值。通常情况下,其最小值是 0。
  • onChange 为回调函数。一般情况下,将滚动条改变后要实现的操作写在回调函数内。

函数 cv2.createTrackbar()用于生成一个滚动条。拖动滚动条,就可以设置滚动条的值,并让滚动条返回对应的值。滚动条的值可以通过函数 cv2.getTrackbarPos()获取,其语法格式为:

retval=getTrackbarPos( trackbarname,winname )

式中:

  • retval 为返回值,获取函数 cv2.createTrackbar()生成的滚动条的值。
  • trackbarname 为滚动条的名称。
  • winname 为滚动条所依附的窗口的名称。

示例:用滚动条实现调色板

在 RGB 颜色空间中,任何颜色都是由红(R)、绿(G)、蓝(B)三种颜色构成的,每一种颜色分量的区间是[0, 255]。

本节用函数 cv2.createTrackbar()和函数 cv2.getTrackbarPos()设计
一个模拟调色板:在窗体中,有三个滚动条分别用来设置 R、G、B 的值,调色板会根据当前的 R、G、B 值实时显示其所对应的颜色。

import cv2
import numpy as np
def changeColor(x):
 r=cv2.getTrackbarPos('R','image')
 g=cv2.getTrackbarPos('G','image')
 b=cv2.getTrackbarPos('B','image')
 img[:]=[b,g,r]
img=np.zeros((100,700,3),np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R','image',0,255,changeColor)
cv2.createTrackbar('G','image',0,255,changeColor)
cv2.createTrackbar('B','image',0,255,changeColor)
while(1):
 cv2.imshow('image',img)
 k=cv2.waitKey(1)&0xFF
 if k==27:
    break
cv2.destroyAllWindows()

在这里插入图片描述

示例2:用滚动条控制阈值处理参数

import cv2
Type=0 # 阈值处理方式
Value=0 # 使用的阈值
def onType(a):
 Type= cv2.getTrackbarPos(tType, windowName)
 Value= cv2.getTrackbarPos(tValue, windowName)
 ret, dst = cv2.threshold(o, Value,255, Type)
 cv2.imshow(windowName,dst)
def onValue(a):
 Type= cv2.getTrackbarPos(tType, windowName)
 Value= cv2.getTrackbarPos(tValue, windowName)
 ret, dst = cv2.threshold(o, Value, 255, Type)
 cv2.imshow(windowName,dst)
o = cv2.imread("lena.png",0)
windowName = "demo.13" #窗体名
cv2.namedWindow(windowName)
cv2.imshow(windowName,o)
# 创建两个滚动条
tType = "Type" # 用来选取阈值处理方式的滚动条
tValue = "Value" # 用来选取阈值的滚动条
cv2.createTrackbar(tType, windowName, 0, 4, onType)
cv2.createTrackbar(tValue, windowName,0, 255, onValue)
if cv2.waitKey(0) == 27:
 cv2.destroyAllWindows()

运行程序,在窗体对象内,同时显示控制阈值和阈值处理方式的两个滚动条。调整滚动条可以分别控制阈值处理时所使用的阈值和阈值处理方式,运行结果如图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/881331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS防火墙操作:开启端口、开启、关闭、配置

一、基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status firewalld 开机禁用 : systemctl disable firewalld 开机启用 : systemctl enable firewalld systemctl是…

iptables之iptables表、链、规则 、匹配模式、扩展模块、连接追踪模块(一)

一、iptables的链 1.请求到达本机: PREROUTING --> INPUT --> Local Process (本机) 2.请求经过本机: PREROUTING --> FORWARD --> POSTROUTING 3.请求从本机发出:local Process(本机&#xf…

计算机竞赛 python 爬虫与协同过滤的新闻推荐系统

1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python 爬虫与协同过滤的新闻推荐系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 该项目较为新颖&…

ReactDOM模块react-dom/client没有默认导出报错解决办法

import ReactDOM 模块“"E:/Dpandata/Shbank/rt-pro/node_modules/.pnpm/registry.npmmirror.comtypesreact-dom18.2.7/node_modules/types/react-dom/client"”没有默认导出。 解决办法 只需要在tsconfig.json里面添加配置 "esModuleInterop": true 即…

无涯教程-Perl - setpwent函数

描述 此功能将枚举设置(或重置)到密码条目集的开头。应该在第一次调用getpwent之前调用此函数。 语法 以下是此函数的简单语法- setpwent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perlwhile(($name, $passwd, $uid, $gid, $quota, …

Makefile多个子文件夹

首先,目录结构: 其中根目录Makefile主要作用是调用其他子文件夹Makefile,每个子模块执行各自编译后在build文件夹下生成obj文件,最后再执行build文件夹下Makefile进行链接。 根目录Makefile: TARGET ACT_Drv ##SRC_D…

java:JDBC

文章目录 什么是JDBCJDBC使用步骤详解各个对象DriverManagerConnectionStatementResultSetPreparedStatement JDBC控制事务操作步骤示例 什么是JDBC 我们知道,数据库有很多种,比如 mysql,Oracle,DB2等等,如果每一种数…

Python运算符全解析:技巧与案例探究

在Python编程中,运算符是强大的工具,能够使我们在数据处理和逻辑判断方面更加灵活。本篇博客将全面探讨Python中常用的运算符,包括算术、比较、逻辑、赋值、位、成员和身份运算符,通过实际案例为你展示如何妙用运算符解决问题。 …

java中的同步工具类CountDownLatch

这篇文章主要讲解java中一个比较常用的同步工具类CountDownLatch,不管是在工作还是面试中都比较常见。我们将通过案例来进行讲解分析。 一、定义 CountDownLatch的作用很简单,就是一个或者一组线程在开始执行操作之前,必须要等到其他线程执…

gitee(码云)如何生成并添加公钥,以及配置用户信息

一,简介 在使用Gitee的时候,公钥是必须的,无论是克隆还是上传。本文主要介绍如何本地生成和添加公钥到服务器,然后配置自己的用户信息,方便日后拉取与上传代码。 二,步骤介绍 2.1 本地生成公钥 打开git ba…

2023牛客暑期多校训练营9-J Puzzle: Star Battle

2023牛客暑期多校训练营9-J Puzzle: Star Battle https://ac.nowcoder.com/acm/contest/57363/J 文章目录 2023牛客暑期多校训练营9-J Puzzle: Star Battle题意解题思路代码 题意 解题思路 出题人都说是诈骗题(,可以发现满足每行每列恰好有 n n n个星…

Mysql复制类型、主从复制集群种类、主从复制原理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 主从复制原理主从复制原理图一、概述二、为什么要读写分离?三、mysql支持的复制类型1、基于语句的复制statement:2、基于行的复制row&#x…

项目经理必知的45个项目管理术语

大家好,我是老原。 项目经理成败与否,80%取决于沟通。 有不少刚入门的项目经理小白,听到自己的上级或者别的项目经理大佬就项目问题进行探讨时,他们时不时就冒出个专业术语,都是一脸懵。 这时候,也不好意…

HCIP学习--路由策略使用实验

未完成 一、实验拓扑 二、实验需求 7的环回不宣告到ospf中,重发布直连到ospf中,且这步操作要在双向重发布前面 两个协议间进行多点双向重发布 R7的环回没有宣告在OSPF协议中,而是后期重发布进入的 解决环路,所有路径选择最优&a…

npm install 中 --save 和 --save-dev 是什么?

npm,全名 Node Package Manager,套件管理工具,package.json 会记下你在项目中安装的所有套件。 假设在项目中安装 lodash npm i --save lodash这样在 dependencies 中会出现: 如果修改了导入方式: npm i --save-dev …

FreeRTOS(动态内存管理)

资料来源于硬件家园:资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、动态内存管理介绍 1、heap_1 2、heap_2 3、heap_3 4、heap_4 5、heap_5 二、动态内存总结与应用 1、heap_1 2、heap_4 3、heap_5 三、内存管理编程测试 1、heap_4 2、h…

变形金刚:从零开始【01/2】

一、说明 在我们的日常生活中,无论你是否是数据科学家,你都在单向地使用变压器模型。例如。如果您使用的是 ChatGPT 或 GPT-4 或任何 GPT,那么在为您回答问题的框中是变压器的一部分。如果您是数据科学家或数据分析师,则可能正在使…

【Linux】IO多路转接——select接口

目录 I/O多路转接之select select初识 select函数 socket就绪条件 select基本工作流程 select服务器 select的优点 select的缺点 select的适用场景 I/O多路转接之select select初识 select是系统提供的一个多路转接接口。 select系统调用可以让我们的程序同时监视多…

vmagent获取node-exporter配置

vmagent 使用以下命令添加图表 helm 存储库: helm repo add vm https://victoriametrics.github.io/helm-charts/helm repo update 列出vm/victoria-metrics-agent可供安装的图表版本: helm search repo vm/victoria-metrics-agent -l victoria-met…

iObit Uninstaller 最新版13 Pro更新了什么?

iObit Uninstaller 专业且易用的 Windows 卸载程序,它可以轻松删除不需要的程序,插件和 Windows 应用程序,还可以对电脑旧的应用一键更新。 功能和特点 安装监视器 安装监视器会检测并记录安装中的所有系统更改,以确保在将来彻底…