2013-10-06 176 views
1

我想加載opencv :: mat圖像與alpha通道OpenGL紋理。加載OpenCV :: mat圖像與opengl紋理中的alpha通道

在以下帖子的幫助下,我可以從opencv :: mat中將RGB圖像加載到OpenGL紋理中。

https://stackoverflow.com/questions/16809833/opencv-image-loading-for-opengl-texture

https://stackoverflow.com/questions/9097756/converting-data-from-glreadpixels-to-opencvmat/9098883#9098883

但是當我嘗試用alpha通道來加載圖像,有一個問題。

這裏是glTexImage2D函數的調用方式。

glTexImage2D(GL_TEXTURE_2D,  // Type of texture 
         0,     // Pyramid level (for mip-mapping) - 
         GL_RGBA,   // Internal colour format to convert to 
         image.cols,   // Image width 
         image.rows,   // Image height 
         0,     // Border width in pixels (can either be 1 or 0) 
         GL_BGRA_INTEGER, // Input image format 
         GL_UNSIGNED_BYTE, // Image data type 
         image.ptr());  // The actual image data itself 

另外,在渲染之前,我使用glEnable(GL_BLEND)來啓用混合;

如果我指定輸入圖像格式和內部顏色格式都是GL_RGBA/GL_BGRA,我會得到一個分割錯誤,但是如果我將它們中的任何一個或兩者都設置爲GL_RGBA_INTEGER,至少我可以看到窗口,但只是空白。

我可以更改透明度,因此窗口變得或多或少透明,但其中沒有圖像。在cv :: mat中有一個圖像,因爲我可以使用cv :: imshow來看它,但不知何故似乎有一個問題將它傳遞給OpenGL紋理。

任何人都可以建議我可能會丟失的東西。提前致謝。

P.S:我是新來的OpenGL,我會很感激,如果有微小的細節解釋..:P

+0

用'GL_UNSIGNED_BYTE'一起使用時,'_INTEGER'像素傳輸格式不使有很大的意義,這些都是特殊的新打包整數格式,如'UNSIGNED_SHORT_5_5_5_1'(16位,其中每個組件是分數整數類型的一部分)。如果你打算使用GL_BGRA_INTEGER,那麼嘗試使用'UNSIGNED_INT_8_8_8_8'而不是'GL_UNSIGNED_BYTE',這至少是合理的。 –

+0

爲什麼你要使用整數圖像格式?傳統的定點/無符號歸一化幾乎肯定是你想要的,你會很清楚爲什麼/當你需要一個實際的整數格式時。 –

+0

對不起,這麼晚回來。我只是在第一步中犯錯,而在opencv中讀取圖像。一旦我糾正它,我只能使用GL_BGRA。謝謝 – formjk

回答

0

我得到它的工作在我的電腦上,能夠加載和顯示png格式的質感。

問題中的代碼是根據以下鏈接中的最後一個答案進行修改的。

OpenCV image loading for OpenGL Texture

我後下

GLuint Texture; 

cv::Mat image = cv::imread("textures/trashbin.png", -1); 

cv::flip(image, image, 0); 
glGenTextures(1, &Texture); 
glBindTexture(GL_TEXTURE_2D, Texture); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

// Set texture clamping method 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 


glTexImage2D(GL_TEXTURE_2D,  // Type of texture 
    0,     // Pyramid level (for mip-mapping) - 0 is the top level 
    GL_RGBA,   // Internal colour format to convert to 
    image.cols,   // Image width i.e. 640 for Kinect in standard mode 
    image.rows,   // Image height i.e. 480 for Kinect in standard mode 
    0,     // Border width in pixels (can either be 1 or 0) 
    GL_BGRA, // Input image format (i.e. GL_RGB, GL_RGBA, GL_BGR etc.) 
    GL_UNSIGNED_BYTE, // Image data type 
    image.ptr()); 

,請注意我工作的代碼(也適合於在上述環節從代碼)3分:

  • -1在在第二行imread調用。它告訴OpenCV加載Alpha通道。我相信這是提問者遇到問題的地方。
  • 上次函數調用中的GL_RGBA和GL_BGRA。
  • cv :: flip(image,image,0);對我來說不是必需的,我實際上已經在我的項目中註釋了它。原因可能是我首先將UV座標翻轉過來。