日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何将cv::Mat类型转换为imgui中的ImTextureID类型

發(fā)布時(shí)間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何将cv::Mat类型转换为imgui中的ImTextureID类型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

背景:

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

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

上面這個(gè)函數(shù)負(fù)責(zé)在imgui中的窗口中顯示圖像。但是需要先將我的cv::Mat類型的圖像轉(zhuǎn)換為這個(gè)的ImTextureID類型。可以通過下面這個(gè)函數(shù)來實(shí)現(xiàn)上述功能。

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

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); }}

函數(shù)說明:

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

注意事項(xiàng)1:

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

我只需要在窗口初始化的時(shí)候,反正就是在while循環(huán)的外面先執(zhí)行一遍:

glGenTextures(1, &imageTexture);

然后把下面的函數(shù)放在while循環(huán)中就可以了。

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); }}

注意事項(xiàng)2:

在函數(shù)Mat2Texture中的glTextImage2D()函數(shù)中我使用的是GL_BGRA和GL_RGBA參數(shù),其實(shí)我在將調(diào)用Mat2Texture函數(shù)之前對(duì)image圖像進(jìn)行如下操作:

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

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

總結(jié)

以上是生活随笔為你收集整理的如何将cv::Mat类型转换为imgui中的ImTextureID类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。