如何将cv::Mat类型转换为imgui中的ImTextureID类型
背景:
我原來(lái)的工程是使用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類型。可以通過(guò)下面這個(gè)函數(shù)來(lái)實(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ù)說(shuō)明:
//用來(lái)產(chǎn)生你要操作的紋理對(duì)象的索引 //n:用來(lái)生成紋理的數(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ì)變得越來(lái)越卡,我剛開始沒(méi)有注意這個(gè)問(wèn)題,將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)換成四通道圖像,如果不這樣做,有些圖像無(wú)法正常的呈現(xiàn)在imgui的窗口中,但是有些圖像也是可以的。我也試過(guò)BGR2BGRA和RGB2RGBA的形式,但是得到的圖像顏色不對(duì),所以你在將cv::Mat轉(zhuǎn)換為Texture時(shí),如果遇到這樣的問(wèn)題可以試一下我上面的方法。
總結(jié)
以上是生活随笔為你收集整理的如何将cv::Mat类型转换为imgui中的ImTextureID类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微信小程序模板平台_小程序模板免费使用_
- 下一篇: MyISAM表加字段的特殊方法