2012-02-03 27 views
6

He visto muchos ejemplos de código para cargar texturas para OpenGL, muchos de ellos un poco complicados de entender o que requieren nuevas funciones con mucho código.Cargando textura para OpenGL con OpenCV

Estaba pensando que a medida que OpenCV nos permite cargar cualquier formato de imagen que puede ser un simple una forma eficiente para cargar texturas de OpenGL , pero estoy perdiendo algo. Tengo este pedazo de código en 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); 
} 

Y no es la compilación debido a este error:

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

¿Alguna sugerencia? ¿Cómo debo hacer la conversión de cv :: Mat a OpenGL Texture?

+0

creo que el uso de OpenCV para texturas de carga es excesiva. Está la biblioteca DevIL que ha sido diseñada explícitamente para esto. – datenwolf

+0

Estoy usando OpenCV en mi proyecto y estoy cambiando constantemente de opengl a datos opencv, es por eso que tuve la idea de reducir las bibliotecas. Gracias de todos modos por el DevIL, lo tendré que ver. –

+0

FreeImage es también otra alternativa (más reciente) a DevIL =) – MiJyn

Respuesta

8

Su error aparece allí, ¿no?

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

porque en if(expr) expr debe ser bool o puede ser moldeado a bool. Pero no hay forma de convertir cv::Mat en boolean implícitamente. Sin embargo, se puede comprobar el resultado de imread así:

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

Ver: cv::Mat::empty(), cv::imread

la esperanza de que le ayudó.

3

El operador de asignación

texture_cv = imread("stones.jpg") 

devuelve un cv::Mat que no se puede utilizar en una expresión condicional. Usted debe escribir algo como

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

o

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

de this doc, le sugiero que cambie su ensayo:

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

Otra pregunta corta ... Creo que puede necesita usar

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

en lugar de

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