【python】OpenCV GUI——Mouse(14.1)

news2025/1/11 21:45:19

在这里插入图片描述

参考学习来自

文章目录

  • 背景知识
  • cv2.setMouseCallback 介绍
  • 小试牛刀

背景知识

GUI(Graphical User Interface,图形用户界面) 是一种允许用户通过图形元素(如窗口、图标、菜单和按钮)与电子设备进行交互的界面。与传统的命令行界面(CLI,Command Line Interface) 相比,GUI 提供了更加直观和易于使用的界面,使得用户无需记忆复杂的命令或语法即可操作设备。

GUI 的主要组成部分包括:

  • 窗口:屏幕上可以独立移动和缩放的矩形区域,用于显示内容或执行特定任务。
  • 图标:表示程序、文件、文件夹或命令的小型图像。
  • 菜单:列出可用命令或选项的列表,用户可以通过鼠标或键盘选择。
  • 按钮:用户可以点击以执行特定命令或操作的图形元素。
  • 文本框:允许用户输入和编辑文本的区域。
  • 对话框:临时窗口,用于接收用户输入或显示信息。
  • 滚动条:允许用户滚动查看长列表或大量内容的小部件。
  • 工具栏:包含常用命令或操作的图标按钮集合。
  • 光标:屏幕上的指示器,显示用户当前正在操作的位置。

GUI 的设计旨在提高用户体验和效率,使用户能够更轻松地完成任务。不同的操作系统和应用程序可能会使用不同的 GUI 风格和约定,但大多数 GUI 都遵循相似的交互原则和设计规范。

在计算机视觉和图像处理领域,GUI 通常用于显示图像、视频或处理结果,以及允许用户通过界面进行参数调整、图像编辑或选择等操作。OpenCV 是一个强大的计算机视觉库,虽然它本身主要关注图像处理和分析的算法实现,但它也提供了一些基本的 GUI 功能,如图像显示、滑动条和鼠标事件处理等,以便用户能够更方便地与图像数据进行交互。然而,对于更复杂的 GUI 需求,开发人员通常会使用专门的 GUI 工具包或框架来构建应用程序界面。

在 OpenCV 中,GUI(图形用户界面)功能主要用于显示图像、处理用户输入(如鼠标点击和键盘按键)以及创建简单的交互界面。OpenCV 提供了一些基本的 GUI 功能,如显示图像窗口、设置鼠标和键盘回调函数、滑动条(Trackbar)等。

这些功能使得 OpenCV 在图像处理和计算机视觉任务中非常有用,尤其是当你需要与用户进行交互时。然而,如果你需要更复杂的 GUI 功能(如按钮、文本框等),那么可能需要考虑使用其他库,如 Tkinter、PyQt、wxPython 等,这些库提供了更丰富的 GUI 控件和更强大的功能。

cv2.setMouseCallback 介绍

cv2.setMouseCallback 是 OpenCV 库中用于设置鼠标回调函数的方法。它允许开发者在 OpenCV 窗口中进行鼠标交互操作,如鼠标点击、拖动等。以下是关于 cv2.setMouseCallback 的中文文档,包含其用法、参数说明以及使用示例。

一、函数用途

cv2.setMouseCallback 用于设置鼠标回调函数,以便在 OpenCV 窗口中检测和处理鼠标事件(如左键点击、右键点击等)。

二、函数语法

cv2.setMouseCallback(windowName, onMouseCallback[, userdata=None])

参数说明

  • windowName(必填):字符串类型,表示要绑定鼠标回调函数的窗口名称。这个窗口需要先通过 cv2.namedWindow() 函数创建。
  • onMouseCallback(必填):一个回调函数,用于处理鼠标事件。当在 windowName 指定的窗口中发生鼠标事件时,该函数将被调用。该函数需要接收五个参数:
    • event:整数类型,表示鼠标事件类型(如左键点击、右键点击等)。
    • x:整数类型,表示鼠标事件发生的 x 坐标(以像素为单位)。
    • y:整数类型,表示鼠标事件发生的 y 坐标(以像素为单位)。
    • flags:整数类型,表示鼠标事件的标志(如鼠标按键状态、鼠标拖动状态等)。
    • param:可选参数,传递给回调函数的附加数据(如果有的话)。
  • userdata(可选):传递给 onMouseCallback 的附加参数。如果没有提供,则默认为 None。
    三、鼠标事件类型
    OpenCV 支持多种鼠标事件类型,包括:

cv2.EVENT_LBUTTONDOWN:左键按下事件。
cv2.EVENT_LBUTTONUP:左键释放事件。
cv2.EVENT_RBUTTONDOWN:右键按下事件。
cv2.EVENT_RBUTTONUP:右键释放事件。
cv2.EVENT_MBUTTONDOWN:中键按下事件。
cv2.EVENT_MBUTTONUP:中键释放事件。
cv2.EVENT_MOUSEMOVE:鼠标移动事件。

小试牛刀

import cv2

# 列表来存储边界框坐标
top_left_corner = []
bottom_right_corner = []


# 函数将在鼠标输入时被调用
def drawRectangle(action, x, y, flags, *param):
    # 引用全局变量
    global top_left_corner, bottom_right_corner
    # 当按下鼠标左键时,标记左上角
    if action == cv2.EVENT_LBUTTONDOWN:
        top_left_corner = [(x, y)]
    # 当松开鼠标左键时,标记右下角,与此同时画框
    elif action == cv2.EVENT_LBUTTONUP:
        bottom_right_corner = [(x, y)]
        # 画矩形
        cv2.rectangle(image, top_left_corner[0], bottom_right_corner[0], (0, 255, 0), 2, 8)
        cv2.imshow("Window", image)


# 读取图片
image = cv2.imread("1.jpg")
# 制作临时图像
temp = image.copy()
# 创建命名窗口
cv2.namedWindow("Window")
# 鼠标事件发生时调用的 Highgui 函数
cv2.setMouseCallback("Window", drawRectangle)

k = 0
# 按下q键关闭窗口
while k != 113:  # q
    # 显示图像
    cv2.imshow("Window", image)
    k = cv2.waitKey(0)
    # 如果按下c,使用虚拟图像清除窗口
    if k == 99:  # c
        image = temp.copy()
        cv2.imshow("Window", image)

cv2.destroyAllWindows()

输入图片

在这里插入图片描述
鼠标拖动画框

在这里插入图片描述

按 c 键 清空所绘制的矩形框,通过显示一个新的原始图片来实现

在这里插入图片描述

按 q 键退出程序

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

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

相关文章

算法—字符串操作

394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string longestCommonPrefix(vector<string>& strs) { string retstrs[0];//***1***记得先要初始化ret&#xff0c;作为第一个比较值for(int i0;i<strs.size();i){retfoundcom…

03-07Java自动化之JAVA基础之循环

JAVA基础之循环 一、for循环 1.1for循环的含义 for&#xff08;初始化语句;条件判断;条件控制或–&#xff09;{ ​ //代码语句 } 1、首先执行初始话语句&#xff0c;给变量一个起始的值 2、条件判断进行判断&#xff0c;为true&#xff0c;执行循环体中的代码语句 ​ …

人体感应提醒 大声公+微波模块

文章目录 模块简介接线程序示例 模块简介 微波感应开关模块 RCWL-0516是一款采用多普勒雷达技术&#xff0c;专门检测物体移动的微波感应模块。采用 2.7G 微波信号检测&#xff0c;该模块具有灵敏度高&#xff0c;感应距离远&#xff0c;可靠性强&#xff0c;感应角度大&#…

DOM型xss靶场实验

DOM型xss可以使用js去控制标签中的内容。 我使用的是一个在线的dom型xss平台&#xff0c;靶场链接&#xff1a;Challenges 第一关Ma Spaghet!&#xff1a; Ma Spaghet! 关卡 <h2 id"spaghet"></h2> <script>spaghet.innerHTML (new URL(locatio…

【QT5】<应用> 小游戏:贪吃蛇

文章目录 一、项目要求 二、需求分析 三、实现效果 四、代码 一、项目要求 【1】主要实现&#xff1a;游戏界面存在一条蛇&#x1f40d;&#xff0c;使用键盘wsad或者↑↓←→键盘可以控制蛇的行走方向。同时界面中会随机出现食物&#xff0c;蛇可以吃食物&#xff0c;然后…

结构体(1)<C语言>

导言 结构体是C语言中的一种自定义类型&#xff0c;它的值&#xff08;成员变量&#xff09;可以是多个&#xff0c;且这些值可以为不同类型&#xff0c;这也是和数组的主要区别&#xff0c;下面将介绍它的一些基本用法&#xff0c;包括&#xff1a;结构体的创建、结构体变量的…

LeetCode714买卖股票的最佳时机含手续费

题目描述 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易&#xff0c;但是你每笔交易都需要付手续费。如果你已经购买了一个股票&#xff0c;在卖出它之前你就不能再继续购买…

鸿蒙北向开发 IDE DevEco Studio 3.1 傻瓜式安装闭坑指南

首先下载 安装IDE 本体程序 DevEco Studio 下载链接 当前最新版本是3.1.1,下载windows版本的 下载下来后是一个压缩包, 解压解锁包后会出现一个exe安装程序 双击运行安装程序 一路 next ( 这里涉及安装文件目录,我因为C盘够大所以全部默认了,各位根据自己情况选择自己的文件…

物证管理系统|DW-S404实现物证科学化管理

随着社会的进步和科技的发展&#xff0c;信息化和数字化已经成为各个行业的必然趋势。在众多领域中&#xff0c;物证管理系统逐渐受到广泛的关注和应用。 物证是公安机关处理案件的关键凭证&#xff0c;针对过去物证管理分散、损毁遗失等严重问题&#xff0c;集驰电子JIONCH推…

使用OpenCV dnn c++加载YOLOv8生成的onnx文件进行实例分割

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集&#xff0c;使用 EISeg 工具进行标注&#xff0c;然后使用 eiseg2yolov8 脚本将.json文件转换成YOLOv8支持的.txt文件&#xff0c;并自动生成YOLOv8支持的目录结构&#xff0c;包括melon.yaml文件&#xff0c;其内容如下…

数字校园的优势有哪些

数字化时代下&#xff0c;数字校园已成为教育领域一股显著趋势。数字校园旨在借助信息技术工具对传统校园进行改造&#xff0c;提供全新的教学、管理和服务方式。那么&#xff0c;数字校园究竟具备何种优势&#xff1f;现从三个方面为您详细介绍。 首先&#xff0c;数字校园为教…

平衡二叉树详解

目录 平衡二叉树的定义 平衡二叉树的基本操作 查找 插入 AVL树的建立 平衡二叉树的定义 平衡二叉树仍然是一棵二叉查找树&#xff0c;只是在其基础上增加了平衡的要求&#xff0c;也就是其左右子树的高度之差的绝对值不超过1。 在定义树的结构时需要加入一个变量height&…

使用树莓派和 L298N 来 DIY 小车底盘

树莓派小车可以作为 STEM&#xff08;科学、技术、工程、数学&#xff09;教育的工具&#xff0c;在实际操作中帮助学生理解和学习电子技术、编程和机器人原理。可以培养学生的动手能力、解决问题的能力和创新思维。 随着近年 AI 技术的高速发展&#xff0c;SLAM、VSLAM 甚至带…

SpringBoot+Vue图书管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户管理员 功能截图

STM32关于uc/OS-III的多任务程序

目录 一、UCOS-III源码获取 二、HAL库工程的建立 1.RCC配置 2.SYS配置 3.USART1配置 4.GPIO配置 5.时钟配置 6.项目配置 三、KEil文件添加 1.文件复制 2.KEil工程添加 3.添加文件路径 四、代码修改 1. 2.修改文件app_cfg.h中代码 3.修改include.h的代码 4.修改…

常见的api: BigInteger

一.获取一个大的随机整数 1.代码: BigInteger bd1 new BigInteger(4, new Random());System.out.println(bd1); 2.打印的结果:2 3.注释获取的是0-16之间的随机整数 二.获取一个指定的大的数 1.代码&#xff1a; BigInteger bd2 new BigInteger("100");System.o…

计网总结☞物理层

五层协议体系结构->各层的功能有&#xff1a; 物理层 物理层的任务就是尽可能地屏蔽传输媒体的差异&#xff0c;透明地传送比特流&#xff08;注意&#xff1a;传递信息的物理媒体&#xff0c;如双绞线、同轴电缆、光缆等&#xff0c;是在物理层的下面&#xff0c;当做第 0…

flink读取hive写入http接口

目录 0、创建hive数据 1、pom.xml 2、flink代码 3、sink 4、提交任务jar 5、flink-conf.yaml 6、数据接收 flink-1.17.2jdk1.8hive-3.1.3hadoop3.3.6passwordhttp0、创建hive数据 /cluster/hive/bin/beeline !connect jdbc:hive2://ip:10000 create database demo; d…

HPC: perf入门

如果你想查看你的程序在cpu上运行时&#xff0c;耗时时如何分布的&#xff0c;那么perf是一个合理的选择。 准备工作 为了支持使用perf&#xff0c;首先你要安装相关的库 sudo apt install linux-tools-5.15.0-67-generic此外&#xff0c;因为使用perf进行benchmark&#xf…

【C语言】预处理详解(上卷)

前言 预处理也是C语言中非常重要的存在。那么就详细地来了解一下吧。 预定义符号 C语言设置了一些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理的。 1 __FILE__ //进行编译的源文件 2 __LINE__ //文件当前的…