当前位置: 首页 > news >正文

opencv鼠标事件函数setMouseCallback()详解

文章目录

        • opencv鼠标事件函数setMouseCallback()详解
          • 1、鼠标事件函数:
            • (1)鼠标事件函数原型:setMouseCallback(),此函数会在调用之后不断查询回调函数onMouse(),直到窗口销毁
            • (2)回调函数onMouse(),可随意命名,但是要与 setMouseCallback()函数里的回调函数名称一致
          • 2、代码示例:
            • (1)main.cpp
            • (2)头文件demo.h
            • (3)demo.cpp
            • (4)效果演示

opencv鼠标事件函数setMouseCallback()详解

1、鼠标事件函数:
(1)鼠标事件函数原型:setMouseCallback(),此函数会在调用之后不断查询回调函数onMouse(),直到窗口销毁
  void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0
)参数解释:winname:窗口名称;onMouse:回调函数;userdata:传递给回调函数用户自定义的外部数据,userdata是一个 void 类型的指针;
(2)回调函数onMouse(),可随意命名,但是要与 setMouseCallback()函数里的回调函数名称一致
void onMouse(int event, int x, int y, int flags, void *userdata
) 参数解释:
event:表示鼠标事件类型的常量(#define CV_EVENT_MOUSEMOVE 0             //滑动#define CV_EVENT_LBUTTONDOWN 1           //左键点击#define CV_EVENT_RBUTTONDOWN 2           //右键点击#define CV_EVENT_MBUTTONDOWN 3           //中键点击#define CV_EVENT_LBUTTONUP 4             //左键放开#define CV_EVENT_RBUTTONUP 5             //右键放开#define CV_EVENT_MBUTTONUP 6             //中键放开#define CV_EVENT_LBUTTONDBLCLK 7         //左键双击#define CV_EVENT_RBUTTONDBLCLK 8         //右键双击#define CV_EVENT_MBUTTONDBLCLK 9         //中键双击
);
x和y:鼠标指针在图像坐标系的坐标;
flags:鼠标事件标志的常量;
userdata:回调函数接收,用户自定义的外部数据,userdata是一个 void 类型的指针;
2、代码示例:

利用鼠标事件函数,提取ROI区域:

(1)main.cpp
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>using namespace cv;
using namespace std;int main() {//读取图像,BGR存储在Mat矩阵里Mat src = cv::imread("C:\\cpp\\image\\suzy4.jpg");if (src.empty()) {printf("could not load image..../n");return -1;}Demo demo;demo.mouseEvent(src);waitKey();destroyAllWindows();return 0;
}
(2)头文件demo.h
#include <opencv2/opencv.hpp>using namespace cv;class Demo
{
public:void mouseEvent(Mat &image);
private:};
(3)demo.cpp
#include <Demo.h>using namespace std;Point sp(-1, -1);
Point ep(-1, -1);
Mat temp;
static void onMouse(int event, int x, int y, int flags, void *userdata) {/*** 对指针userdata,进行转换和解引用的操作,将userdata指向的Mat对象,赋值给名为image的变量,以便后续对图像数据的处理:* userdata是一个void类型的指针,需要转换为Mat类型的指针,然后用*运算符解引用,得到Mat对象,再赋值给名为image的变量,这样就可以对image进行操作了;*/Mat image = *((Mat*)userdata);if (event == EVENT_LBUTTONDOWN) {// 起点坐标sp.x = x;sp.y = y;std::cout << "start point:" << sp << std::endl;}else if (event == EVENT_LBUTTONUP) {ep.x = x;ep.y = y;// 结束点坐标int dx = ep.x - sp.x;int dy = ep.y - sp.y;if (dx > 0 && dy > 0) {Rect box(sp.x, sp.y, dx, dy);temp.copyTo(image);imshow("ROI区域", image(box));rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);imshow("鼠标绘制", image);// ready for next drawingsp.x = -1;sp.y = -1;}}else if (event == EVENT_MOUSEMOVE) {if (sp.x > 0 && sp.y > 0) {ep.x = x;ep.y = y;int dx = ep.x - sp.x;int dy = ep.y - sp.y;if (dx > 0 && dy > 0) {Rect box(sp.x, sp.y, dx, dy);temp.copyTo(image);rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);imshow("鼠标绘制", image);}}}
}void Demo::mouseEvent(Mat &image) {namedWindow("鼠标事件", WINDOW_AUTOSIZE);/*** 由于回调函数需要传入的是一个void类型指针,我们先取image的地址,再将&image强制转换为void类型指针,具体操作如下:* &image:获取变量image的内存地址,即Mat对象的指针;* (void*):是一个强制类型转换,将image的地址转换为void类型指针,这样就可以将参数传递给回调函数了;*/setMouseCallback("鼠标绘制", onMouse, (void*)(&image));imshow("鼠标绘制", image);temp = image.clone();
}
(4)效果演示

在这里插入图片描述

相关文章:

opencv鼠标事件函数setMouseCallback()详解

文章目录 opencv鼠标事件函数setMouseCallback()详解1、鼠标事件函数&#xff1a;&#xff08;1&#xff09;鼠标事件函数原型&#xff1a;setMouseCallback()&#xff0c;此函数会在调用之后不断查询回调函数onMouse()&#xff0c;直到窗口销毁&#xff08;2&#xff09;回调函…...

硬件知识积累 USB 接口 type - A type - B type - C 的介绍与功能说明 (简单介绍)

1. USB 的介绍 1.1 USB 的定义 USB : 通用串行总线(英语: Universal Serial Bus&#xff0c;缩写:USB)是一种串口总线标准&#xff0c;也是一种输入输出接口的技术规范&#xff0c;被广泛地应用于个人电脑和移动设备等信息通讯产品&#xff0c;并扩展至摄影器材、数字电视&a…...

【LeetCode】290. 单词规律

这里写自定义目录标题 2023-8-30 09:34:23 290. 单词规律 2023-8-30 09:34:23 这道题目&#xff0c;我是根据 205. 同构字符串 的思路一样&#xff0c;都转化为另外一个第三方的字符串&#xff0c;在比较翻译过后的语句是不是一样的。 class Solution {public boolean wordP…...

研磨设计模式day12迭代器模式

目录 场景 解决方案 解决思路 代码示例 代码改造 Java实现迭代器 迭代器模式的优点 思考 何时选用 场景 大公司收购了一个小公司&#xff0c;大公司的工资系统采用List来记录工资列表&#xff0c;而小公司是采用数组&#xff0c;老板希望通过决策辅助系统来统一查看…...

Python3不支持sqlite3的解决方法

先贴报错&#xff1a; >>> import sqlite3 Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/usr/local/lib/python3.10/sqlite3/__init__.py", line 57, in <module>from sqlite3.dbapi2 impor…...

Qt应用开发(基础篇)——消息对话框 QMessageBox

一、前言 QMessageBox类继承于QDialog&#xff0c;是一个模式对话框&#xff0c;常用于通知用户或向用户提出问题并接收答案。 对话框QDialog QMessageBox消息框主要由四部分组成&#xff0c;一个主要文本text&#xff0c;用于提醒用户注意某种情况;一个信息文本informativeTex…...

ETC reset

ETC重新激活 换前挡风玻璃膜会把ETC设备拿下来&#xff0c;需要到【ETC服务中心】重新【粘上去】&#xff0c;另外需要工作人员用手持终端【重新激活】 ETC 背面有个 【白色】开关小柱子&#xff0c;一旦拆下来就失效&#xff0c;因为这个开关弹出来了 截面图看就是这样的&…...

2023年8月30日-[SWPUCTF 2021 新生赛]jicao

<?php highlight_file(index.php); include("flag.php"); $id$_POST[id]; $jsonjson_decode($_GET[json],true); if ($id"wllmNB"&&$json[x]"wllm") {echo $flag;} ?> 包含了flag.php文件&#xff0c;设定了一个POST请求的id和…...

MariaDB数据库服务器

目录 一、什么是数据库&#xff1f; 二、什么是关系型数据库&#xff1f; 三、数据库字符集和排序规则是什么&#xff1f; 四、常用数据类型 五、Mariadb数据库相关配置案例 一、什么是数据库&#xff1f; 数据库&#xff08;DB&#xff09;是以一定方式长期存储在计算机硬盘内…...

Nat. Mach. Intell 2023 | DrugBAN+:域自适应的可解释双线性插值网络改进药物-靶标预测(DTI)

DrugBAN&#xff1a;Interpretable bilinear attention network with domain adaptation improves drug–target prediction 论文&#xff1a;Interpretable bilinear attention network with domain adaptation improves drug–target prediction | Nature Machine Intellige…...

org.springframework.web.reactive.function.server.ServerResponse设置响应头

记录一下 String host serverRequest.uri().getHost();Consumer<HttpHeaders> headersConsumer consumer -> {consumer.setAccessControlAllowOrigin(host);consumer.setAccessControlAllowCredentials(true);consumer.set("Access-Control-Allow-Headers"…...

高频面试题:如何分别用三种姿势实现三个线程交替打印0到100

最近面试遇到的一道题&#xff0c;需要三个线程交替打印0-100&#xff0c;当时对多线程并不是很熟悉因此没怎么写出来&#xff0c;网上搜了之后得到现 synchronized wait/notifyAll 实现思路&#xff1a;判断当前打印数字和线程数的取余&#xff0c;不等于当前线程则处于等待…...

【git】Idea撤回本地分支、或远程分支提交记录的各种实际场景操作步骤

文章目录 idea撤回本地分支、远程分支场景操作集合场景1&#xff1a;要撤回最后一次本地分支的提交实现效果&#xff1a;操作步骤&#xff1a; 场景2&#xff1a;要撤回最后一次远程分支的提交有撤销记录的&#xff1a;实现效果&#xff1a;操作步骤&#xff1a; 无撤销记录的&…...

FPGA SPI 驱动程序

1.引言 此驱动程序已经完成很久了&#xff0c;花了2个星期的时间&#xff0c;主要是提升程序运行的效率。最近整理文件的时候又看到了&#xff0c;记录一下。 2.程序框架分解 module adc7254_Ctrl(input sys_clk, //system clkc 50Minput re…...

【实战】十一、看板页面及任务组页面开发(五) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十七)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…...

mac m1 docker 安装kafka和zookeeper

获取本地ip地址 ifconfig en0 192.168.0.105. 下面的ip都会使用到 1、拉取镜像 docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka 2、启动容器 启动 zookeeper docker run -d --name zookeeper -p 2181:2181 映射 3、 启动 kafka 注意&#xff…...

宏观经济和风电预测误差分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

GO学习之 搜索引擎(ElasticSearch)

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…...

Sentinel —实时监控

Sentinel 提供对所有资源的实时监控。如果需要实时监控&#xff0c;客户端需引入以下依赖&#xff08;以 Maven 为例&#xff09;&#xff1a; <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artif…...

接口优化通用方案

目录 批量异步、回调缓存预取池化并行锁粒度索引大事务海量数据 批量 批量思想&#xff1a;批量操作数据库 优化前&#xff1a; //for循环单笔入库 for(TransDetail detail:transDetailList){ insert(detail); } 优化后&#xff1a; batchInsert(transDetailList); 异步、回…...

PathOfBuilding架构深度解析:流放之路离线构建规划器的技术实现方案

PathOfBuilding架构深度解析&#xff1a;流放之路离线构建规划器的技术实现方案 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding PathOfBuilding是《流放之路》最权威的离…...

FFTW3内存管理最佳实践:fftw_malloc与数据对齐技巧

FFTW3内存管理最佳实践&#xff1a;fftw_malloc与数据对齐技巧 【免费下载链接】fftw3 DO NOT CHECK OUT THESE FILES FROM GITHUB UNLESS YOU KNOW WHAT YOU ARE DOING. (See below.) 项目地址: https://gitcode.com/gh_mirrors/ff/fftw3 FFTW3&#xff08;Fastest Fou…...

ESP32-WROOM-32E开发板快速上手:5分钟搞定Arduino环境配置与LED灯控制

ESP32-WROOM-32E开发板极速入门&#xff1a;5分钟玩转LED控制 刚拿到ESP32-WROOM-32E开发板时&#xff0c;最让人兴奋的莫过于立刻让它"活"起来。作为乐鑫推出的明星级物联网开发板&#xff0c;它集Wi-Fi/蓝牙双模、丰富外设接口和超低功耗于一身&#xff0c;而Ardui…...

手机也能跑AI?实测3B以下小模型在安卓/iOS端的部署教程(附性能对比)

手机端AI模型实战&#xff1a;3B以下小模型在安卓/iOS的部署与优化指南 当ChatGPT需要数据中心级算力支撑时&#xff0c;你可能没想到自己的手机也能运行类似技术。本文将带你探索移动端AI部署的完整方案——从Termux环境配置到CoreML模型转换&#xff0c;实测Redmi Note 12 Tu…...

《基于S7-1200PLC的全自动洗衣机控制系统设计》 一、设计任务书 1.任务描述

《基于S7-1200PLC的全自动洗衣机控制系统设计》 一、设计任务书 1.任务描述&#xff1a;洗衣机的进水和排水分别由进水电磁阀和排水电磁阀来执行 进水时&#xff0c;通过电控系统时进水阀打开&#xff0c;将水由外桶排到机外 洗涤正转、反转由洗涤电动机驱动波盘正、反转来实现…...

Alberta Wells数据集:从213,000个井位到全球环境监测,计算机视觉如何重塑油气设施追踪

1. 油气井监测的全球挑战与环境意义 想象一下&#xff0c;你正站在加拿大阿尔伯塔省广袤的草原上&#xff0c;脚下可能就隐藏着数十个被遗忘的油气井。这些钢铁结构的"时间胶囊"有的已经沉寂数十年&#xff0c;却仍在持续释放比二氧化碳强效84倍的甲烷气体。这就是全…...

别再只盯着CLIP了!用PaddlePaddle复现VSE++图文互搜模型(附Flickr8k数据集处理全流程)

突破CLIP局限&#xff1a;基于PaddlePaddle的轻量化图文检索实战指南 在当今多模态AI领域&#xff0c;CLIP等大型模型虽然表现出色&#xff0c;但其庞大的参数量和计算需求让许多开发者和企业望而却步。本文将带您探索一种更轻量、更高效的替代方案——VSE模型&#xff0c;并手…...

Buildroot工具链内核版本号快速查询:3步搞定LINUX_VERSION_CODE解析

Buildroot工具链内核版本号快速查询&#xff1a;3步搞定LINUX_VERSION_CODE解析 在嵌入式开发中&#xff0c;工具链与内核版本的匹配问题常常让开发者头疼不已。想象一下这样的场景&#xff1a;你花费数小时编译的代码突然报错&#xff0c;仅仅因为工具链使用的内核头文件版本与…...

nginx——方向代理和负载均衡

目录 1.1 Nginx概述 1.1.1 企业青睐 Nginx 的核心原因 1.1.2 Nginx的作用 1.3 反向代理和负载均衡 1.4 注 1.4.1 代理百度并使用 18090 端口 1.1 Nginx概述 1.1.1 企业青睐 Nginx 的核心原因 Nginx 由俄罗斯开发者打造&#xff0c;具有超高稳定性&#xff08;资源占用极低…...

YOLOv8鹰眼目标检测实战:一键部署,实时识别80种物体(附WebUI)

YOLOv8鹰眼目标检测实战&#xff1a;一键部署&#xff0c;实时识别80种物体&#xff08;附WebUI&#xff09; 1. 项目概述 1.1 什么是YOLOv8鹰眼目标检测 YOLOv8鹰眼目标检测是基于Ultralytics最新YOLOv8模型的工业级解决方案。它能够在毫秒级别完成图像中多达80类物体的识别…...