[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…

华为OD机试 - 单向链表中间节点(Java JS Python C C++)

题目描述 给定一个单链表 L&#xff0c;请编写程序输出 L 中间结点保存的数据。 如果有两个中间结点&#xff0c;则输出第二个中间结点保存的数据。例如&#xff1a; 给定 L 为 1→7→5&#xff0c;则输出应该为7&#xff1b; 给定 L 为 1→2→3→4&#xff0c;则输出应该为…

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

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

王道c语言-chap13 栈实例

王道c语言-chap13 栈实例 #include <iostream>#define END -1 #define MaxSize 50typedef int ElemType; typedef struct {int data[MaxSize];int top; } SqStack;void InitStack(SqStack &s) {s.top-1; }void PrinfSqStack(SqStack s) {for (int i 0; i < s.to…

什么是布隆过滤器

布隆过滤器&#xff08;Bloom Filter&#xff09;是一种概率型数据结构&#xff0c;用于判断一个元素是否存在于一个集合中。它的主要优点是占用空间少、查询速度快&#xff0c;并且支持高效的插入和查询操作。 布隆过滤器由一个位数组和多个哈希函数构成。初始时&#xff0c;…

八股文三(Spring、Spring Cloud Alibaba)

Spring篇 什么是Spring Spring是个轻量级的框架&#xff0c;他有两大内核分别是IOC、AOPIOC是什么 * 依赖注入和控制反转&#xff0c;它是一种思想&#xff0c;创建对象不是直接new出来&#xff0c;而是交给IOC容器&#xff0c;由容器去创建进行管理&#xff0c;这就是控制反…

解决antd vue 的table列表过宅内容换行和过长有空白列的问题

主要有两个注意点 1、columns数组中保留一个对象不设置宽度&#xff0c;其余都要设置宽度&#xff1b; 2、HTML中scroll要设置为{x: 足够长的固定宽度}&#xff1b; 具体代码如下&#xff1a; <a-tableref"table"size"middle"rowKey"rowSerial&qu…

字符串函数---(1)

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

(70min)字节暑假实习二面(已挂)

还没找到工作的小伙伴加油&#xff01; 字节看面评果然名不虚传。。 面试官&#xff1a; 看你一面基础也回答得不好&#xff0c;没事&#xff0c;那我就不问你八股&#xff0c;多问项目吧。 然后开始鞭打项目。 项目使用mq&#xff0c;从背景的&#xff0c;技术选型&#xff0…

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…

关于我的经历

技能 1 Java基础扎实&#xff0c;具备并发编程经验&#xff0c;熟悉JMM、线程通信线程安全、锁、原子类、阻塞队列、并发容器、线程池原理。清楚并发内容的实现原理。阅读过部分JDK源码。 深入了解JVM虚拟机&#xff1a;内存模型、GC、垃圾回收算法、以及垃圾回收器&#xff0…

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

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

蓝桥杯第14届模拟赛最大连通分块(dfs)

问题描述(答案148)   小蓝有一个 30 行 60 列的数字矩阵&#xff0c;矩阵中的每个数都是 0 或 1 。 110010000011111110101001001001101010111011011011101001111110 010000000001010001101100000010010110001111100010101100011110 001011101000100011111111111010000010010…

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 …

考研模拟面试-题目【攻略】

考研模拟面试-题目【攻略】 前言版权推荐考研模拟面试-题目前面的问题通用问题专业题数据结构计算机网络操作系统数据库网络安全 手写题数据结构操作系统计算机网络 代码题基础代码题其他代码题 后面的问题补充题目 最后 前言 2023-10-19 12:00:57 以下内容源自《考研模拟面试…