[Qt学习笔记]Qt鼠标事件mouseMoveEvent实时获取图像的坐标和像素值

目录

  • 1、介绍
  • 2、效果展示
  • 3、实现过程
    • 3.1 图像的加载和显示
    • 3.2 设置鼠标跟踪事件激活
    • 3.3 实现代码
  • 4、源码展示

1、介绍

上一篇介绍了使用OpenCV的setMouseCallback回调函数实现获取鼠标点击点的图像坐标和像素值,本篇使用鼠标事件mouseMoveEvent函数来实现实时获取鼠标的坐标和对应图像点的像素值,并将结果实时显示在label控件上。

2、效果展示

123.gif

3、实现过程

3.1 图像的加载和显示

这里加载图像并在QLabel控件上显示,我这里使用OpenCV的imread函数加载了图像,然后把图像转换成QPixmap显示在QLabel上。

    img = imread("lena.png");cvtColor(img, img, COLOR_BGR2RGB);QImage disImage = QImage((const unsigned char*)(img.data), img.cols, img.rows, QImage::Format_RGB888);QPixmap pix = QPixmap::fromImage(disImage);pix.scaled(ui->lbl_pic->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);ui->lbl_pic->setPixmap(pix);  // label 显示图像

这里也可以直接用QPixmap的load函数加载图像和显示,然后在mouseMoveEvent函数中要通过OpenCV获取图像的像素值时,将QPixmap格式再转换成Mat类型。

3.2 设置鼠标跟踪事件激活

激活控件内鼠标跟随属性,调用setMouseTracking(true)激活后在鼠标点击控件内区域进入mouseMoveEvent函数实现鼠标跟随。
如果想不点击鼠标在控件内移动触发mouseMoveEvent函数,就需要同时设置控件和窗口的setMouseTracking(true),这样鼠标在控件内移动时可以实时跟踪鼠标事件。

    /*激活控件鼠标跟随属性,激活后在点击鼠标后进入mouseMoveEvent函数*//*如果不点击鼠标时想要在控件上触发mouseMoveEvent函数,就需要同时激活控件和窗口*/ui->lbl_pic->setMouseTracking(true);setMouseTracking(true);
void Widget::mouseMoveEvent(QMouseEvent *event)
{QPoint pt = event->pos();QRect rect = ui->lbl_pic->geometry();if(rect.contains(pt)){QPoint PicPoint = QPoint(pt.x()-rect.x(), pt.y()- rect.y());QString str = QString("(x:%1,y:%2)").arg(PicPoint.x()).arg(PicPoint.y());ui->lbl_pos->setText(str);if(img.channels() == 1){int grayValue;switch (img.type()){case 0:grayValue = static_cast<int>(img.at<uchar>(Point(PicPoint.x(), PicPoint.y())));break;case 1:grayValue = static_cast<int>(img.at<char>(Point(PicPoint.x(), PicPoint.y())));break;case 2:grayValue = static_cast<int>(img.at<ushort>(Point(PicPoint.x(), PicPoint.y())));break;case 3:grayValue = static_cast<int>(img.at<short>(Point(PicPoint.x(), PicPoint.y())));break;case 4:grayValue = static_cast<int>(img.at<int>(Point(PicPoint.x(), PicPoint.y())));break;case 5:grayValue = static_cast<int>(img.at<float>(Point(PicPoint.x(), PicPoint.y())));break;case 6:grayValue = static_cast<int>(img.at<double>(Point(PicPoint.x(), PicPoint.y())));break;}}else{int value_B = static_cast<int>(img.at<Vec3b>(Point(PicPoint.x(), PicPoint.y()))[0]);int value_G = static_cast<int>(img.at<Vec3b>(Point(PicPoint.x(), PicPoint.y()))[1]);int value_R = static_cast<int>(img.at<Vec3b>(Point(PicPoint.x(), PicPoint.y()))[2]);QString str = QString("B:%1, G:%2, R:%3").arg(value_B).arg(value_G).arg(value_R);ui->lbl_pix->setText(str);}}
}

3.3 实现代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMouseEvent>
#include "opencv2/opencv.hpp"QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEusing namespace cv;
class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();protected:void mouseMoveEvent(QMouseEvent *event);
private:Ui::Widget *ui;Mat img;
};
#endif // WIDGET_H

widget.cpp

#pragma execution_character_set("utf-8")
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("坐标像素实时监控");img = imread("lena.png");cvtColor(img, img, COLOR_BGR2RGB);QImage disImage = QImage((const unsigned char*)(img.data), img.cols, img.rows, QImage::Format_RGB888);QPixmap pix = QPixmap::fromImage(disImage);pix.scaled(ui->lbl_pic->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);// label 显示图像ui->lbl_pic->setPixmap(pix);/*激活控件鼠标跟随属性,激活后在点击鼠标后进入mouseMoveEvent函数*//*如果不点击鼠标时想要在控件上触发mouseMoveEvent函数,就需要同时激活控件和窗口*/ui->lbl_pic->setMouseTracking(true);setMouseTracking(true);
}Widget::~Widget()
{delete ui;
}void Widget::mouseMoveEvent(QMouseEvent *event)
{QPoint pt = event->pos();QRect rect = ui->lbl_pic->geometry();if(rect.contains(pt)){QPoint PicPoint = QPoint(pt.x()-rect.x(), pt.y()- rect.y());QString str = QString("(x:%1,y:%2)").arg(PicPoint.x()).arg(PicPoint.y());ui->lbl_pos->setText(str);if(img.channels() == 1){            //单通道图像int grayValue;switch (img.type()){case 0:grayValue = static_cast<int>(img.at<uchar>(Point(PicPoint.x(), PicPoint.y())));break;case 1:grayValue = static_cast<int>(img.at<char>(Point(PicPoint.x(), PicPoint.y())));break;case 2:grayValue = static_cast<int>(img.at<ushort>(Point(PicPoint.x(), PicPoint.y())));break;case 3:grayValue = static_cast<int>(img.at<short>(Point(PicPoint.x(), PicPoint.y())));break;case 4:grayValue = static_cast<int>(img.at<int>(Point(PicPoint.x(), PicPoint.y())));break;case 5:grayValue = static_cast<int>(img.at<float>(Point(PicPoint.x(), PicPoint.y())));break;case 6:grayValue = static_cast<int>(img.at<double>(Point(PicPoint.x(), PicPoint.y())));break;}QString str = QString("Gray Value:%1").arg(grayValue);ui->lbl_pix->setText(str);}else                                //多通道图像{int value_B = static_cast<int>(img.at<Vec3b>(Point(PicPoint.x(), PicPoint.y()))[0]);int value_G = static_cast<int>(img.at<Vec3b>(Point(PicPoint.x(), PicPoint.y()))[1]);int value_R = static_cast<int>(img.at<Vec3b>(Point(PicPoint.x(), PicPoint.y()))[2]);QString str = QString("B:%1, G:%2, R:%3").arg(value_B).arg(value_G).arg(value_R);ui->lbl_pix->setText(str);}}
}

4、源码展示

本小例程的代码放到我的开源gitte项目里,欢迎一起学习,也希望能收获你的小星星。
项目源码PixelPos_MouseFollow

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

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

相关文章

OPPO 后端二面,凉凉。。。

美众议院通过 TikTok 法案 之前我们讲了 老美要求字节跳动在 165 天内剥离短视频应用 TikTok&#xff0c;当时的最新进度是 TikTok 给 1.7 亿美国用户发弹窗&#xff0c;发动用户群众给国会打电话进行抗议。 但显然这点力度的抗议并不会造成什么实质影响。 昨晚&#xff0c;美国…

精读《useRef 与 createRef 的区别》

1 引言 useRef 是常用的 API&#xff0c;但还有一个 createRef 的 API&#xff0c;你知道他们的区别吗&#xff1f;通过 React.useRef and React.createRef: The Difference 这篇文章&#xff0c;你可以了解到何时该使用它们。 2 概述 其实原文就阐述了这样一个事实&#xf…

【EDSR】《Enhanced Deep Residual Networks for Single Image Super-Resolution》

CVPR workshops-2017 首尔大学 code&#xff1a; https://github.com/limbee/NTIRE2017/tree/masterhttps://github.com/sanghyun-son/EDSR-PyTorch 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4.1 Residual blocks4.2 Single…

盘点国内IP地址服务的功能及提供商

随着互联网的快速发展和普及&#xff0c;IP地址服务提供商在中国市场扮演着越来越重要的角色。这些代理软件提供商不仅为用户提供稳定的网络连接&#xff0c;还可以帮助用户实现IP地址切换、绕过地理限制等功能。虎观代理接下来将详解国内IP地址服务的主要功能&#xff0c;并对…

字符串函数---(1)

字符函数 文章目录 前言1.strlen 的使用和模拟实现2.strcpy 的使用和模拟实现3. strcat 的使用和模拟实现4. strcmp 的使用和模拟实现 前言 上一篇我们学习了字符函数&#xff0c;下来我们学习常见的字符串函数 1.strlen 的使用和模拟实现 size_t strlen(const char *str) 字…

DDOS攻击防御介绍

DDOS&#xff1a;分布式拒绝服务攻击 瞬间收到大量数据 总带宽是有限的 合法用户访问的时候&#xff0c;被非法方法流量占据 无法溯源 流量清洗&#xff1a;AntiDdos 边界&#xff0c;旁挂的 备用域名&#xff0c;ip更换 机房会提供解决方案 解决不了问题&#xff0c;就干…

【真实体会】花几百块买ChatGPT4.0账号一年值得吗?

GPT4.0使用体验及价值 性能提升: GPT4比GPT3.5在内容质量和数量上有显著提高&#xff0c;使得知乎等平台的收益增加。 功能丰富: GPT4支持文本、图片、文件问答&#xff0c;而GPT3.5仅支持文本。GPT4内置多种专业工具&#xff08;GPTS&#xff09;&#xff0c;如设计师LOGO的A…

Android Studio实现内容丰富的安卓视频管理平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号081 1. 开发环境 android stuido 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.本地视频 3.视频播放 4.收藏功能 5.网路视频 6.个人中心 7.我的收藏 8.浏览历史 3.系…

Redis高阶使用消息队列分布式锁排行榜等

一、前言 在大多数传统的web系统中&#xff0c;使用Redis一般都是作为缓存使用&#xff0c;在大数据查询时作为缓解性能的一种解决方案。博主的的系统中使用Redis也主要使用到缓存的作用&#xff0c;还有做了注册中心&#xff0c;分布式事务。其他的强大的功能&#xff0c;没有…

【哈希表】算法例题

目录 五、哈希表 39. 赎金信 ① 40. 同构字符串 ① 41. 单词规律 ① 42. 有效的字母异位词 ① 43. 字母异位词分组 ② 44. 两数之和 ① 45. 快乐数 ① 46. 存在重复元素 ① 47. 最长连续序列 ② 五、哈希表 39. 赎金信 ① 给你两个字符串&#xff1a;ransomNote 和 m…

Linux课程_____网络管理

一、查看接口信息 1. ifconfig 查看所有活动网络接口的信息 ifconfig -a 查看所有网络接口信息 ifconfig 直接加网络接口 查看指定网络接口信息 1.1查看指定接口IP [rootlocalhost ~]# ip addr show ens160 1.2设置网络接口的IP地址 # ifconfig eth0 192.168.152.133 …

全国各省市县统计年鉴/中国环境统计年鉴/中国工业企业数据库/中国专利数据库/污染排放数据库

统计年鉴是指以统计图表和分析说明为主&#xff0c;通过高度密集的统计数据来全面、系统、连续地记录年度经济、社会等各方面发展情况的大型工具书来获取统计数据资料。 统计年鉴是进行各项经济、社会研究的必要前提。而借助于统计年鉴&#xff0c;则是研究者常用的途径。目前国…

DC-DC 变换集成电路芯片MC34063A测试参数介绍

MC34063A 为一单片 DC-DC 变换集成电路&#xff0c;内含温度补偿的参考电压源&#xff08;1.25V&#xff09;、比较器、能有效限制电流及控制工作周期的振荡器&#xff0c;驱动器及大电流输出开关管等。外配少量元件&#xff0c;就能组成升压、降压及电压反转型 DC-DC 变换器。…

基于springboot+vue的火锅店管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

[做题]动态规划

文章目录 0.DP前言1.线性DP数字三角形朴素做法更优雅的写法一维优化(朴素版本) 最长上升子序列朴素做法二分&#xff08;数据加强版&#xff09; 最长公共子序列朴素做法 最短编辑距离朴素做法 编辑距离朴素做法 2.其他DP区间dp石子合并 计数dp整数划分dp写法&#xff1a;完全背…

AI - 机器学习GBDT算法

目录 GBDT 提升树 梯度提升树 GBDT算法实战案例 XGBoost &#x1f606;&#x1f606;&#x1f606;感谢大家的观看&#x1f606;&#x1f606; GBDT 梯度提升决策树&#xff08;Gradient Boosting Decision Tree&#xff09;&#xff0c;是一种集成学习的算法&…

手机投屏到电脑

手机投屏到电脑 Github 有2个开源的手机投屏项目&#xff1a; Scrcpy: https://github.com/Genymobile/scrcpy QtScrcpy: https://github.com/barry-ran/QtScrcpy 这2个项目都很好用&#xff0c;我这里用的是 Scrcpy&#xff1a; 官方文档中介绍了如何在windows上使用 Scrcpy…

基于龙芯2k1000 mips架构ddr调试心得(一)

1、基础知识 DDR2的I/O频率是DDR的2倍&#xff0c;也就是266、333、400MHz。 DDR3传输速率介于 800&#xff5e;1600 MT/s之间 DDR4的传输速率目前可达2133&#xff5e;3200 MT/s 2k1000内存&#xff1a;板载2GB DDR3 &#xff0c;可选4GB 使用龙芯芯片最好用他们自己的Bo…

C++特性三:多态的基本语法及原理剖析

一、多态的基本语法 多态分为两类 静态多态: 函数重载 和 运算符重载属于静态多态&#xff0c;复用函数名 动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别&#xff1a; 静态多态的函数地址早绑定 - 编译阶段确定函数地址 动态多态的函数地址晚绑定 - 运…

【Python】使用selenium对Poe批量模拟注册脚本

配置好接码api即可实现自动化注册登录试用一体。 运行后会注册账号并绑定邮箱与手机号进行登录试用。 测试结果30秒一个号 import re import time import requests from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options imp…