2012-02-03 127 views
6

我已經看到很多加載紋理的代碼示例,這些代碼樣本可用於加載OpenGL,其中許多代碼有點複雜,無法理解或需要使用大量代碼的新功能。使用OpenCV加載OpenGL紋理

我在想,作爲OpenCV的使我們能夠加載任何圖像格式,它可以是一個簡單的加載紋理OpenGL的一種有效的方式,但我失去了一些東西。我有這樣一段代碼在C++

cv::Mat texture_cv; 
GLuint texture[1]; 
int Status=FALSE; 

if(texture_cv = imread("stones.jpg")) { 

     Status=TRUE;       // Set The Status To TRUE 
     glGenTextures(1, &texture[0]);     // Create The Texture 


     glBindTexture(GL_TEXTURE_2D, texture[0]);    
     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S , GL_REPEAT); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

     glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_cv.cols, texture_cv.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_cv.data); 
} 

而且這還不是因爲這個錯誤的編譯:

error C2451: conditional expression of type 'cv::Mat' is illegal

有什麼建議?我應該如何做從cv :: Mat到openGL紋理的轉換?

+0

我認爲使用OpenCV加載紋理是矯枉過正。有一個爲此明確設計的圖書館DevIL。 – datenwolf 2012-02-03 09:17:11

+0

我在我的項目中使用OpenCV,並且我經常從opengl更改爲opencv數據,這就是爲什麼我有了減少庫的想法。無論如何感謝DevIL,我會看看它。 – 2012-02-03 09:21:56

+0

FreeImage也是DevIL的另一個(更新的)替代方法=) – MiJyn 2013-09-28 08:03:27

回答

8

你的錯誤出現在那裏,對嗎?

if(texture_cv = imread("stones.jpg")) { 

因爲if(expr)表達式必須是bool或可強制轉換爲bool。但是沒有辦法將cv::Mat隱式轉換爲布爾值。但你可以檢查的imread這樣的結果:

texture_cv = imread("stones.jpg"); 
if (texture_cv.empty()) { 
    // handle was an error 
} else { 
    // do right job 
} 

見:cv::Mat::empty()cv::imread

希望有所幫助你。

3

賦值運算符

texture_cv = imread("stones.jpg") 

返回不能在條件表達式中使用的cv::Mat。你應該寫類似

if((texture_cv = imread("stones.jpg")) != /* insert condition here */) { 
     //... 
} 

texture = imread("stone.jpg"); 
if(!texture.empty()) { 
      //... 
} 
2

this醫生,我建議你改變你的測試:

texture_cv = imread("stones.jpg"); 
if (texture_cv.data != NULL) { 
    ... 
0

另一個短的問題... 我想你可能需要使用

glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_cv.cols, texture_cv.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_cv.ptr()); 

而不是

glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_cv.cols, texture_cv.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_cv.data);