qt图像处理-将OpenCV的cv::Mat类型转换为QImage类型

在使用Qt进行图像处理时,经常需要将OpenCV的cv::Mat类型转换为QImage类型。以下是几种有效的方法,可以根据具体情况选择合适的方法进行转换。

方法一:直接使用QImage构造函数

这种方法直接使用QImage的构造函数,通过传递cv::Mat的指针和相关参数来创建QImage对象。这种方法较为简单,但需要注意OpenCV和Qt对颜色通道的不同处理方式(BGR与RGB)。

#include <QImage>
#include <opencv2/opencv.hpp>QImage MatToQImage(const cv::Mat& mat) {cv::Mat rgb;cv::cvtColor(mat, rgb, cv::COLOR_BGR2RGB);  // 将BGR格式转换为RGB格式QImage img((const uchar*)rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_RGB888);return img.copy();  // 拷贝数据,避免内存问题
}

方法二:指定步长(step)

在某些情况下,直接使用步长(step)参数可以避免图像显示的扭曲问题。使用QImage构造函数时,传递mat.step参数。

QImage MatToQImage(const cv::Mat& mat) {cv::Mat rgb;cv::cvtColor(mat, rgb, cv::COLOR_BGR2RGB);QImage img((const uchar*)rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_RGB888);return img.copy();
}

方法三:处理非连续内存布局的矩阵

对于非连续内存布局(non-continuous memory layout)的矩阵,应该显式指定步长mat.step1(),以避免图像扭曲。

QImage MatToQImage(const cv::Mat& mat) {cv::Mat rgb;cv::cvtColor(mat, rgb, cv::COLOR_BGR2RGB);QImage img((const uchar*)rgb.data, rgb.cols, rgb.rows, mat.step1(), QImage::Format_RGB888);return img.copy();
}

方法四:逐像素转换

对于更加复杂的情况,可以逐像素进行转换。这种方法可以处理不同的图像类型,比如24位RGB和灰度浮点图像。

QImage MatToQImage(const cv::Mat3b &src) {QImage dest(src.cols, src.rows, QImage::Format_ARGB32);for (int y = 0; y < src.rows; ++y) {const cv::Vec3b *srcrow = src[y];QRgb *destrow = (QRgb*)dest.scanLine(y);for (int x = 0; x < src.cols; ++x) {destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255);}}return dest;
}QImage MatToQImage(const cv::Mat_<double> &src) {double scale = 255.0;QImage dest(src.cols, src.rows, QImage::Format_ARGB32);for (int y = 0; y < src.rows; ++y) {const double *srcrow = src[y];QRgb *destrow = (QRgb*)dest.scanLine(y);for (int x = 0; x < src.cols; ++x) {unsigned int color = srcrow[x] * scale;destrow[x] = qRgba(color, color, color, 255);}}return dest;
}

总结

以上介绍了几种将OpenCV的cv::Mat转换为QImage的方法。根据具体需求选择合适的方法,例如是否需要处理颜色通道转换、内存布局、以及图像类型等。通过合理使用这些方法,可以在Qt应用程序中高效地处理和显示OpenCV图像。

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

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

相关文章

AI绘画Stable Diffussion 实操教程: 真人图片秒变动漫风,亲手绘制你的专属动漫头像

大家好&#xff0c;我是向阳 你是否曾幻想过自己置身于动漫世界&#xff0c;拥有那些令人羡慕的二次元特征&#xff1f;随着人工智能技术的飞速发展&#xff0c;这一幻想已不再遥不可及。在本文中&#xff0c;我们将一起揭开Stable Diffusion技术的神秘面纱&#xff0c;探索如…

WebFlux 和 Spring Security 会碰出哪些火花?

项目创建成功后&#xff0c;我们添加一个接口&#xff0c;用来获取登录用户信息&#xff0c;如下&#xff1a; RestController public class UserController { GetMapping(“/user”) public Mono getCurrentUser(Mono principal) { return principal; } } 注意我们的返…

音频信号分析

目录 一&#xff0c;音频获取 二&#xff0c;信号的基本形态 三&#xff0c;衰减信号的频域信号 四&#xff0c;低频信号 五&#xff0c;高频信号 六&#xff0c;七个音节的频率 一&#xff0c;音频获取 我用电子琴&#xff08;音色模式是卧式钢琴&#xff09;&#xff…

Vue-Cli 创建vue2.0 + TypeScript 项目

这里写目录标题 一、创建项目名称二、选择 Manually select features三、勾选配置项四、选择vue版本五、其它配置 一、创建项目名称 vue create 项目名称&#xff08;项目名字不能含义大写字母&#xff09;二、选择 Manually select features &#xff08;按箭头上下进行移动…

Windows系统Maven下载安装

下载&#xff1a; 官网地址&#xff1a;https://maven.apache.org/download.cgi 安装&#xff1a; 下载下来的是一个压缩包&#xff0c;首先将其解压到你的Maven目标安装位置 接下来为其配置其环境变量 &#xff08;Maven的基础是Java&#xff0c;因此要首先确认已为你的电…

钡铼技术BL101串口6路Modbus转MQTT网关加速智慧城市部署

随着物联网技术的飞速发展&#xff0c;如何高效地整合传统设备与现代云端系统&#xff0c;成为了亟待解决的关键问题。钡铼技术&#xff0c;作为物联网领域的硬件设备制造商&#xff0c;近期推出的BL101六路串口Modbus转MQTT网关&#xff0c;正以其独特优势&#xff0c;为智慧城…

【FFmpeg】AVFrame结构体

【FFmpeg】AVFrame结构体 1.AVFrame结构体的定义enum AVPictureType pict_typeAVFrameSideData **side_data 参考&#xff1a; FFMPEG结构体分析&#xff1a;AVFrame 示例工程&#xff1a; 【FFmpeg】调用ffmpeg库实现264软编 【FFmpeg】调用ffmpeg库实现264软解 【FFmpeg】调…

【漏洞复现】脸爱云一脸通智慧管理平台 SystemMng 管理用户信息泄露漏洞(XVE-2024-9382)

0x01 产品简介 脸爱云一脸通智慧管理平台是一套功能强大&#xff0c;运行稳定&#xff0c;操作简单方便&#xff0c;用户界面美观&#xff0c;轻松统计数据的一脸通系统。无需安装&#xff0c;只需在后台配置即可在浏览器登录。 功能包括:系统管理中心、人员信息管理中心、设备…

Mysql实战中的一些小tips

1. 问题&#xff1a;使用select进行查表&#xff0c;出现连接事务一直连接&#xff0c;导致锁表&#xff0c;没办法对表格进行修改操作。 解决办法&#xff1a; # 在建立conn连接时&#xff0c;设置commit如下&#xff1a;self.dbconn MySQLdb.connect(hostsql_conf.MYSQL_HO…

力扣(2024.06.24)

1. 68——文本左右对齐 给定一个单词数组 words 和一个长度 maxWidth &#xff0c;重新排版单词&#xff0c;使其成为每行恰好有 maxWidth 个字符&#xff0c;且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词&#xff1b;也就是说&#xff0c;尽可能多地往…

在WordPress上添加亚马逊联盟链接的三种方法

在互联网快速发展的今天&#xff0c;很多人都希望通过网络来增加收入&#xff0c;而加入亚马逊联盟计划&#xff08;Amazon Associates&#xff09;无疑是一个不错的选择。如果你有一个WordPress网站&#xff0c;那么在文章中添加亚马逊联盟链接是个很好的变现方式。今天&#…

倩女幽魂搬砖攻略:2024搬砖攻略大全!云手机强力辅助!

《倩女幽魂》手游是一款具有极高自由度和丰富玩法的角色扮演游戏。为了帮助玩家更好地了解并掌握游戏中的各种技巧和策略&#xff0c;本文将为大家提供详细的攻略指南。我们将从每日签到、任务升级、银两经营、必做活动和出金等多个方面详细介绍&#xff0c;帮助玩家轻松玩转游…

JAVA项目跑不起来

场景 项目报各种问题&#xff1a;要么application配置读取不到、要么项目结构不对、要么Idea InteliJ 的基础配置让重新配… 处理了一个问题&#xff0c;又有另一个问题… 但是&#xff0c;别人能跑起来。 原因 缓存问题。 解决办法 重新拉取项目&#xff0c;运行即可。

#C++ -STL容器之vector(浓缩版)#

vector容器是C标准库中的一个动态数组容器。 它允许你在运行时动态地添加或删除元素。它提供了随机访问的能力&#xff0c;这意味着你可以像访问数组一样直接通过索引访问元素&#xff0c;同时又具有动态大小的优势。 vector的功能与C语言中的数组十分相似&#xff0c;但是功…

MyBatis-Plus 查询不到数据,但使用 SQL 可以查询到数据的问题排查

目录 前言 一、问题描述 示例代码 二、排查步骤 1. 检查数据源配置 2. 检查实体类与数据库表结构 3. 检查 Mapper 接口 4. 检查 MyBatis-Plus 配置 5. 排查查询条件 6. 检查日志输出 7. 检查数据库连接问题 8. 检查全局配置和插件 三、解决方案 前言 在开发过程中&…

百度Agent初体验(制作步骤+感想)

现在AI Agent很火&#xff0c;最近注册了一个百度Agent体验了一下&#xff0c;并做了个小实验&#xff0c;拿它和零一万物&#xff08;Yi Large&#xff09;和文心一言&#xff08;ERNIE-4.0-8K-latest&#xff09;阅读了相同的一篇网页资讯&#xff0c;输出资讯摘要&#xff0…

[职场] 线上面试的准备工作 #知识分享#经验分享#媒体

线上面试的准备工作 面对求职中的面试&#xff0c;应届毕业生该做些什么准备呢&#xff1f;在这里&#xff0c;向各位分享面试前做好预案不慌张几点准备。现在许多面试是通过线上形式进行的。对于求职者来说&#xff0c;要做好两手准备。在这里&#xff0c;重点与大家分享线上面…

解决vue3使用ref 获取不到子组件属性问题

需求&#xff1a; 父子组件使用<script setup>语法糖&#xff0c;父组件通过给子组件定义ref访问子组件内部属性或事件。 关键点&#xff1a; 子组件中&#xff0c;setup语法糖需要用defineExpose把要读取的属性和方法单独暴露出去&#xff0c;否则会访问失败&#xf…

el-dialog el-select适配移动端

一、el-dialog 2024.06.20今天我学习了如何对el-dialog弹窗适配移动端展示&#xff0c;效果如下&#xff1a; 代码如下&#xff1a; media screen and (min-width: 220px) and (max-width: 600px) {::v-deep .el-dialog {width: 95% !important;} } 二、el-select 代码如下…

Gorm 实践:使用 gorm.ErrRecordNotFound 判断元组是否存在

Gorm 提供了很多错误类型给我们使用&#xff0c;今天我们介绍较为常见的 gorm.ErrRecordNotFound&#xff0c;我们将用其实现较为常见的存在性判断逻辑。之所以常见&#xff0c;是因为我们常需要使用存在性判断&#xff0c;来避免使用不存在的结果的结果集或重复插入数据行。 …