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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85805.shtml
英文地址,請注明出處:http://en.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;一種更高效…