OpenCV种的cv::Mat与Qt种的QImage类型相互转换

一、首先了解cv::Mat结构体

cv::Mat::step与QImage转换有着较大的关系。

step的几个类别区分:

  • step:矩阵第一行元素的字节数
  • step[0]:矩阵第一行元素的字节数
  • step[1]:矩阵中一个元素的字节数
  • step1(0):矩阵中一行有几个通道数
  • step1(1):一个元素有几个通道数(channel())
    cv::Mat cvmat(3, 4, CV_16UC4, cv::Scalar_<uchar>(1, 2, 3, 4));std::cout << cvmat<< std::endl;std::cout << "step:" << cvmat.step << std::endl;std::cout << "step[0]:" << cvmat.step[0] << std::endl;std::cout << "step[1]:" << cvmat.step[1] << std::endl;std::cout << "step1(0):" << cvmat.step1(0) << std::endl;std::cout << "step1(1):" << cvmat.step1(1) << std::endl;

运行结果:

分析:
创建了一个3∗4的16位4通道的矩阵;

每一个元素赋值为1,2,3,4;可以看到生成了3*4*4的矩阵;

因为创建的是16位的,所以每一个通道是2个字节数;

所以一行共有4*4*2=32个字节数,故step和step[0]都为32;

因为一个元素有4个通道,每个通道2个字节,所以1个元素的字节数step[1]为4*2=8;

一行是4个元素,每个元素是4个通道,所以一行的通道数,step1(0)为4*4=16,step1(1)为4;

二、cv::Mat转QImage

代码示例为拷贝转换:

QImage cvMat2QImage(const cv::Mat& mat) 
{if (mat.empty()){return QImage();}QImage image;switch (mat.type()){case CV_8UC1:{image = QImage((const uchar*)(mat.data),mat.cols, mat.rows, mat.step,QImage::Format_Grayscale8);return image.copy();}case CV_8UC2:{mat.convertTo(mat, CV_8UC1);image = QImage((const uchar*)(mat.data),mat.cols, mat.rows, mat.step,QImage::Format_Grayscale8);return image.copy();}case CV_8UC3:{// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);return image.rgbSwapped();}case CV_8UC4:{// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);return image.copy();}case CV_32FC1:{Mat normalize_mat;normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1);normalize_mat.convertTo(normalize_mat, CV_8U);const uchar *pSrc = (const uchar*)normalize_mat.data;QImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_Grayscale8);return image.copy();}case CV_32FC3:{Mat normalize_mat;normalize(mat, normalize_mat, 0, 255, NORM_MINMAX,-1);normalize_mat.convertTo(normalize_mat, CV_8U);const uchar *pSrc = (const uchar*)normalize_mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_RGB888);return image.rgbSwapped();}case CV_64FC1:{Mat normalize_mat;normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1);normalize_mat.convertTo(normalize_mat, CV_8U);const uchar *pSrc = (const uchar*)normalize_mat.data;QImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_Grayscale8);return image.copy();}case CV_64FC3:{Mat normalize_mat;normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1);normalize_mat.convertTo(normalize_mat, CV_8U);const uchar *pSrc = (const uchar*)normalize_mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_RGB888);return image.rgbSwapped();}case CV_32SC1:{Mat normalize_mat;normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1);normalize_mat.convertTo(normalize_mat, CV_8U);const uchar *pSrc = (const uchar*)normalize_mat.data;QImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_Grayscale8);return image.copy();}case CV_32SC3:{Mat normalize_mat;normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1);normalize_mat.convertTo(normalize_mat, CV_8U);const uchar *pSrc = (const uchar*)normalize_mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_RGB888);return image.rgbSwapped();}case CV_16SC1:{Mat normalize_mat;normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1);normalize_mat.convertTo(normalize_mat, CV_8U);const uchar *pSrc = (const uchar*)normalize_mat.data;QImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_Grayscale8);return image.copy();}case CV_16SC3:{Mat normalize_mat;normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1);normalize_mat.convertTo(normalize_mat, CV_8U);const uchar *pSrc = (const uchar*)normalize_mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_RGB888);return image.rgbSwapped();}case CV_8SC1:{//Mat normalize_mat;//normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1);mat.convertTo(mat, CV_8U);const uchar *pSrc = (const uchar*)mat.data;QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8);return image.copy();}case CV_8SC3:{mat.convertTo(mat, CV_8U);const uchar *pSrc = (const uchar*)mat.data;QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);return image.rgbSwapped();}default:mat.convertTo(mat, CV_8UC3);QImage image((const uchar*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);return image.rgbSwapped();return QImage();break;}
}

三、QImage转cv::Mat

示例代码为共享内存转换:

cv::Mat QImage2cvMat(QImage& image)
{cv::Mat mat;//qDebug() << image.format();switch (image.format()){case QImage::Format_ARGB32:mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());break;case QImage::Format_RGB32:mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());//cv::cvtColor(mat, mat, CV_BGR2RGB);break;case QImage::Format_ARGB32_Premultiplied:mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());break;case QImage::Format_RGB888:mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());//cv::cvtColor(mat, mat, CV_BGR2RGB);break;case QImage::Format_Indexed8:mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());break;case QImage::Format_Grayscale8:mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());break;}return mat;
}

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

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

相关文章

搭建基于VsCode的ESP32的开发环境教程

一、VsCode搜索ESP-IDF插件 根据插件处搜索找到ESP-IDF并安装 安装完成 二、配置安装ESP-IDF 配置IDF 按照如下配置&#xff0c;点击安装 安装完成 三、使用案例程序 创建一个闪光灯的例子程序&#xff0c;演示程序编译下载。 选择blink例子&#xff0c;闪烁LED的程序 选…

企业培训学习考试系统源码 ThinkPHP框架+Uniapp支持多终端适配部署

在数字化转型浪潮下&#xff0c;企业对高效培训与精准考核的需求日益迫切。一套功能完备、多终端适配且易于定制的培训学习考试系统&#xff0c;成为企业提升员工能力、检验培训成果的关键工具。本文给大家分享一款基于 ThinkPHP 框架与 Uniapp 开发的企业培训学习考试系统&…

【PmHub面试篇】PmHub集成Redission分布式锁保障流程状态更新面试专题解析

你好&#xff0c;欢迎来到本次关于PmHub整合TransmittableThreadLocal (TTL)缓存用户数据的面试系列分享。在这篇文章中&#xff0c;我们将深入探讨这一技术领域的相关面试题预测。若想对相关内容有更透彻的理解&#xff0c;强烈推荐参考之前发布的博文&#xff1a;【PmHub后端…

mac 设置cursor (像PyCharm一样展示效果)

一、注册 Cursor - The AI Code Editor 二、配置Python环境 我之前使用pycharm创建的python项目&#xff0c;以及创建了虚拟环境&#xff0c;现在要使用cursor继续开发。 2.1 选择Python 虚拟环境 PyCharm 通常将虚拟环境存储在项目目录下的 venv 或 .venv 文件夹中&#xf…

Spring事务失效-----十大常见场景及解决方案全解析

Spring事务失效的常见场景及原因分析 Spring事务管理是开发中的核心功能,但在实际应用中可能因各种原因导致事务失效。以下是常见的事务失效场景及详细解析: 1. 方法未被Spring管理 场景:使用new关键字直接创建对象,而非通过Spring容器注入原因:Spring事务基于AOP代理,…

刚出炉热乎的。UniApp X 封装 uni.request

HBuilder X v4.66 当前最新版本 由于 uniapp x 使用的是自己包装的 ts 语言 uts。目前语言还没有稳定下来&#xff0c;各种不支持 ts 各种报错各种不兼容问题。我一个个问题调通的&#xff0c;代码如下&#xff1a; 封装方法 // my-app/utils/request.uts const UNI_APP_BASE…

【ArcGIS微课1000例】0148:Geographic Imager6.2使用教程

文章目录 一、Geographic Imager6.2下载安装二、Geographic Imager6.2使用方法1. 打开Geographic Imager2. 导入地理影像3. 导入DEM地形渲染4. 设置地理坐标系统5. 进行地理影像的处理6. 导出地理影像一、Geographic Imager6.2下载安装 在专栏上一篇文章中已经详细讲述了Geogr…

零基础安装 Python 教程:从下载到环境配置一步到位(支持 VSCode 和 PyCharm)与常用操作系统操作指南

零基础安装 Python 教程&#xff1a;从下载到环境配置一步到位&#xff08;支持 VSCode 和 PyCharm&#xff09;与常用操作系统操作指南 本文是一篇超详细“Python安装教程”&#xff0c;覆盖Windows、macOS、Linux三大操作系统的Python安装方法与环境配置&#xff0c;包括Pyt…

定时任务的 cron 表达式

定时任务的 cron 表达式 一、什么时 cron 表达式 Cron表达式是一种广泛应用于Linux系统的时间表示格式&#xff0c;常用于定时任务的调度。Cron表达式可以通过指定不同的时间参数&#xff0c;描述一个在 未来某个时间点执行的任务。 二、Cron表达式语法 秒 分 时 日 月 周几…

PHP+mysql 美容美发预约小程序源码 支持DIY装修+完整图文搭建教程

在数字化浪潮席卷的当下&#xff0c;美容美发行业也急需线上转型&#xff0c;以提升客户预约效率与服务体验。开发一款美容美发预约小程序成为众多商家的迫切需求。本文将为大家分享一套基于 PHPMySQL 的美容美发预约小程序源码&#xff0c;功能完备、支持 DIY 装修&#xff0c…

十八、【用户认证篇】安全第一步:基于 JWT 的前后端分离认证方案

【用户认证篇】安全第一步:基于 JWT 的前后端分离认证方案 前言什么是 JWT (JSON Web Token)?准备工作第一部分:后端 Django 配置 JWT 认证1. 安装 `djangorestframework-simplejwt`2. 在 `settings.py` 中配置 `djangorestframework-simplejwt`3. 在项目的 `urls.py` 中添加…

03 Deep learning神经网络的编程基础 代价函数(Cost function)--吴恩达

深度学习中的损失函数(Cost Function)用于量化模型预测与真实数据的差距,是优化神经网络的核心指标。以下是常见类型及数学表达: 核心原理 逻辑回归通过sigmoid函数将线性预测结果转换为概率: y ^ ( i ) \hat{y}^{(i)}

Linux信号捕捉技术深度解析

根据您的需求&#xff0c;文章可以聚焦技术实现与实践的结合&#xff0c;以下提供几个标题方案供选择&#xff1a; 方案一&#xff08;学术向标题&#xff09; 《Linux信号捕捉机制全解析&#xff1a;内核态捕获原理、可重入函数实践与SIGCHLD异步处理中的volatile陷阱》 方案…

【大模型部署】mac m1本地部署 ChatGLM3-6B 超详细教程

本人环境&#xff1a;macOS 15.5 (Sonoma) - Apple M1 / 16 G 目标&#xff1a;在 mac m1 16G 上 完全离线 的本地模型目录上&#xff0c;跑通官方 ChatGLM3-6B 目录 背景 & 踩坑记录 准备工作 新建 Conda 环境并安装依赖 关键环境变量 运行 composite_demo 常见报错与…

Redis命令使用

Redis是以键值对进行数据存储的&#xff0c;添加数据和查找数据最常用的2个指令就是set和get。 set&#xff1a;set指令用来添加数据。把key和value存储进去。get&#xff1a;get指令用来查找相应的键所对应的值。根据key来取value。 首先&#xff0c;我们先进入到redis客户端…

Linux打开.img镜像文件

kparkx 可以查看和修改img文件的内容 1.安装kparkx 1.安装 kpartx sudo apt-get update sudo apt-get install kpartx2.使用kpartx映射镜像文件 假设镜像文件名为 example.img &#xff0c;以下命令会将其分区映射到 dev/mapper/ sudo kpartx -av example.img• -a表示添加…

6.4 计算机网络面试题

HTTP到底是不是无状态的&#xff1f; 无状态即每个请求都是独立的&#xff0c;服务器不会在多个请求间保存关于客户端状态的信息。 HTTP虽然是无状态的&#xff0c;但是可以通过一些机制保存状态&#xff0c;如使用cookies session跟踪用户状态。 携带Cookie的HTTP请求是有状…

基于千帆大模型的AI体检报告解读系统实战:使用OSS与PDFBox实现PDF内容识别

目录 说明 前言 需求 流程说明 表结构说明 整体流程 百度智能云 注册和实名认证 创建应用 费用说明 大模型API说明 集成大模型 设计Prompt 上传体检报告 读取PDF内容 功能实现 智能评测 抽取大模型工具 功能实现 总结 说明 AI体检报告解读、病例小结或者…

湖北理元理律师事务所:债务优化中的生活保障实践

在债务压力与生活质量失衡的普遍困境中&#xff0c;法律服务的价值不仅在于解决债务问题&#xff0c;更在于帮助债务人重建生活秩序。湖北理元理律师事务所通过其债务优化服务&#xff0c;探索出一条“法律生活”的双轨路径。 债务规划的核心矛盾&#xff1a;还款能力与生存需…

无人机智能识别交通目标,AI视觉赋能城市交通治理新高度

在城市化快速发展的当下&#xff0c;如何实现对道路交通的智能化管理、保障出行安全&#xff0c;成为城市治理的重要命题。传统的交通监控往往依赖地面摄像头&#xff0c;受限于固定视角与安装环境。而今&#xff0c;随着人工智能与无人机技术的深度融合&#xff0c;一种更高效…