如何將cv::Mat類型轉換為imgui中的ImTextureID類型

背景:

我原來的工程是使用opencv的,所以程序中的圖像都是表示為cv::Mat類型,為了能夠在imgui窗口中顯示我的cv::Mat的圖像,我找到了下面這個函數:

void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1,const ImVec4& tint_col, const ImVec4& border_col)

上面這個函數負責在imgui中的窗口中顯示圖像。但是需要先將我的cv::Mat類型的圖像轉換為這個的ImTextureID類型。可以通過下面這個函數來實現上述功能。

cv::Mat& image為待轉換的cv::Mat圖像,GLuint& imageTexture就是ImGui::Image()函數中需要的類型。

void Mat2Texture(cv::Mat& image, GLuint& imageTexture) {if (image.empty()) {std::cout << "image is empty! " << std::endl;return;}else {//generate texture using GL commandsglGenTextures(1, &imageTexture);glBindTexture(GL_TEXTURE_2D, imageTexture);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexImage2D(GL_TEXTURE_2D,0,GL_BGRA,image.cols,image.rows,0,GL_RGBA,GL_UNSIGNED_BYTE,image.data);		}}

函數說明:

//用來產生你要操作的紋理對象的索引
//n:用來生成紋理的數量
//texture:用于存儲紋理索引
glGenTextures(GLsizei n, GLuint *textures);
//glBindTexture實際上改變了OpenGL的這個狀態,他告訴OpenGL下面對紋理的操作都是對他綁定的紋理對象的
//比如下面這里,就是在告訴opengl下面代碼中對2D紋理的任何操作都是針對索引imageTexture的紋理的。
glBindTexture(GL_TEXTURE_2D, imageTexture);

注意事項1:

函數glGenTextures(GLsizei n, GLuint *textures);只能放在循環外面使用,否則當程序循環次數多了以后,程序很吃內存,電腦會變得越來越卡,我剛開始沒有注意這個問題,將Mat2Texture函數放在了while循環里面,眼看著我的內存占用率直線上升。這是因為Mat2Texture函數中的glGenTextures函數被反復調用。而我需要將視頻流數據源源不斷的更新到imgui的窗口中,所以我需要循環調用Mat2Texture函數。那么我可以將函數換成下面的形式。

我只需要在窗口初始化的時候,反正就是在while循環的外面先執行一遍:

glGenTextures(1, &imageTexture);

然后把下面的函數放在while循環中就可以了。

void Mat2Texture(cv::Mat& image, GLuint& imageTexture) {if (image.empty()) {std::cout << "image is empty! " << std::endl;return;}else {//generate texture using GL commandsglBindTexture(GL_TEXTURE_2D, imageTexture);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexImage2D(GL_TEXTURE_2D,0,GL_BGRA,image.cols,image.rows,0,GL_RGBA,GL_UNSIGNED_BYTE,image.data);		}}

注意事項2:

在函數Mat2Texture中的glTextImage2D()函數中我使用的是GL_BGRA和GL_RGBA參數,其實我在將調用Mat2Texture函數之前對image圖像進行如下操作:

cv::cvtColor(image, image, cv::COLOR_RGB2BGRA);

就是將RGB模式轉換為BGRA模式。明顯的區別是把之前的三通道圖像轉換成四通道圖像,如果不這樣做,有些圖像無法正常的呈現在imgui的窗口中,但是有些圖像也是可以的。我也試過BGR2BGRA和RGB2RGBA的形式,但是得到的圖像顏色不對,所以你在將cv::Mat轉換為Texture時,如果遇到這樣的問題可以試一下我上面的方法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252259.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252259.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252259.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

react native 原生模塊橋接的簡單說明

原文出自&#xff1a;https://github.com/prscX/awes...博客鏈接&#xff1a;https://ssshooter.com/2019-02... Android 創建原生模塊包 通過繼承 ReactPackage 為你的原生模塊包創建 Java 類&#xff0c;可以這么寫&#xff1a;覆蓋 createNativeModules 和 createViewManage…

UVa 1354 天平難題 枚舉二叉樹

題意&#xff1a;給出房間寬度 r 和 s 個掛墜的重量 wi&#xff0c;設計一個盡量寬的天平&#xff0c;掛著所有掛墜。天平由一些長度為 1 的木棍組成&#xff0c;木棍的每一端要么掛一個掛墜&#xff0c;要么掛另外一個木棍。 這題卡了很久&#xff0c;看了很多大神的代碼&…

通過指針便利圖像元素

for (size_t y 0; y < image.rows; y) {//row_ptr為第y行的頭指針&#xff0c;unsigned char* row_ptr image.ptr<unsigned char>(y);for (size_t x 0; x < image.cols; x) {//data_ptr: 指向待訪問像素unsigned char* data_ptr &row_ptr[x*image.channels…

[精華][推薦]SSO CAS單點登錄框架學習 搭建詳細步驟及源碼

1.了解單點登錄 SSO 主要特點是: SSO 應用之間使用 Web 協議(如 HTTPS) &#xff0c;并且只有一個登錄入口. SSO 的體系中有下面三種角色: 1) User(多個) 2) Web 應用(多個) 3) SSO 認證中心(一個) 2.SSO 實現包含以下三個原則 1) 所有的登錄都在 SSO 認證中心進行。 2) SS…

電腦下載的M4A格式文件怎么轉換為MP3格式

M4A文件格式并不是一個家喻戶曉的名字&#xff0c;與&#xff2d;&#xff30;&#xff13;格式相比&#xff0c;知名度遠遠落后。但是&#xff0c;這并不意味著它無關緊要&#xff0c;有時候我們下載的音樂可能就是M4A格式的&#xff0c;如果換一個設備播放可能就會出現格式不…

python-for循環

一、功能 for 循環提供了python中最強大的循環結構&#xff08;for循環是一種迭代循環機制&#xff0c;而while循環是條件循環&#xff0c;迭代即重復相同的邏輯操作&#xff0c;每次操作都是基于上一次的結果&#xff0c;而進行的&#xff09; Python for循環可以遍歷任何序列…

六、利用frp穿透連接內網的linx系統和windows系統

服務端的配置 # frps.ini [common] bind_port 7000 說明&#xff1a;防火墻放行該端口 啟動&#xff1a;./frps -c ./frps.ini 后臺啟動&#xff1a;nohup ./frps -c ./frps.ini & 客戶端的配置 (1)windows系統 # frpc.ini [common] server_addr x.x.x.x server_port 70…

根據相機內參進行圖像去畸變

cv::Mat img; cv::Mat img_undistort; double fx,fy, cx, cy, k1, k2, p1, p2, k3;for(int v 0; v < img.rows; v){for(int u 0; u < img.cols; u){//根據內參數&#xff0c;計算歸一化坐標系下的坐標點double x (u-cx)/fx;double y (v-cy)/fy;double r2 x*x y*y;/…

initialize方法與load方法比較

load方法和initialize方法類似點 1. 都只會調用一次2. 父類在子類之前加載 復制代碼不同點在于&#xff1a; 1. 加載時間不同&#xff0c;load方法在main()函數前進行調用&#xff0c;initialize在第一次調用類的所屬方法時在調用<可能永遠不調用>。2. load方法不會被Cat…

KindEditor

1、進入官網 2、下載 官網下載&#xff1a;http://kindeditor.net/down.php 3、文件夾說明 ├── asp asp示例 ├── asp.net asp.net示例 ├── attached 空文件夾&#xff0c;放置關聯文件attached ├── …

service mysqld start,Failed to start mysqld.service: Access denied

service mysqld start 然后報&#xff1a; AUTHENTICATING FOR org.freedesktop.systemd1.manage-units Authentication is required to start mysqld.service.Authenticating as: lll,,, (lll)Password: polkit-agent-helper-1: pam_authenticate failed: Authentication fa…

使用realsense t265測試svo2.0視覺里程計

畢業三年了&#xff0c;現在是第二份工作&#xff0c;第一份工作已經結束一年半了&#xff0c;這意味著&#xff0c;我有一年半的時間沒有搞視覺SLAM相關的東西了&#xff0c;雖然在第二份工作也是做視覺相關的&#xff0c;但是只是用到一些目標識別和跟蹤的知識&#xff0c;并…

JSP動作標識

jsp中include有兩種形式: include指令&#xff1a;<% include file""%> include動作&#xff1a;<jsp:include page"" /> 他們的區別&#xff1a; <% include file""%>又稱靜態包含&#xff0c;使用時要注意以下幾點&#xf…

面試必問之JVM原理

1&#xff1a;什么是JVM JVM是Java Virtual Machine&#xff08;Java虛擬機&#xff09;的縮寫&#xff0c;JVM是一種用于計算設備的規范&#xff0c;它是一個虛構出來的計算機&#xff0c;是通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機包括一套字節碼指令…

InfluxDB學習之InfluxDB的基本操作

InfluxDB提供類SQL語法&#xff0c;如果熟悉SQL的話會非常容易上手。本文就為大家介紹一下InfluxDB的基本操作。 InfluxDB提供類SQL語法&#xff0c;如果熟悉SQL的話會非常容易上手。 一、InfluxDB操作方式 InfluxDB提供三種操作方式&#xff1a; 1&#xff09;客戶端命令行方式…

運行svo 2.0的 vio時遇到opencv沖突的問題

當我運行如下指令時&#xff0c;遇到了如下問題 指令 cd svo_ws source ./devel/setup.bash roslaunch svo_ros euroc_vio_mono.launch rosbag play MH_01_easy.bag -s 50 運行時遇到的問題 OpenCV Error: Bad argument (Unknown interpolation method) in resize, file /b…

DOS Network一月項目月報

歡迎大家閱讀DOS Network第一期項目月報&#xff01;DOS為了跟大家更好的溝通和交流&#xff0c;將在每個月為大家跟進DOS Network項目進展月報。月報主要分為項目研發和社區及營銷兩個部分。 如果你是剛認識DOS Network預言機網絡的新朋友&#xff0c;歡迎查閱往期文章&#x…

lsof詳解

from:https://www.cnblogs.com/the-study-of-linux/p/5501593.html lsof (list open files)是一個列出當前系統打開文件的工具。在linux系統環境下&#xff0c;任何事物都可以以文件形式存在&#xff0c;通過文件不僅可以訪問常規的數據&#xff0c;還可以訪問網絡連接和硬件。…

Ubuntu18.04上下載安裝使用sogou輸入法

下載地址&#xff1a;搜狗輸入法Linux官網-首頁 安裝設置網址&#xff1a;搜狗輸入法Linux官網-安裝指導 這樣Ubuntu下工作就更加方便了。

正則

&#xff08;一&#xff09;字符類 [...]  方括號內的任意字符 [^...]   不在方括號內的任意字符 .    除換行符和其它Unicode行終止符之外的任意字符 \w   任何ASCII字符組成的單詞&#xff0c;等價于[a-zA-Z0-9] \W   任何非ASCII字符組成的單詞&#xff0c;等價…