2011-03-15 14 views
12

Estoy tratando de asignar la entrada de mi cámara web a un plano en OpenGL. Estoy usando OpenCV para obtener las imágenes de la cámara web.OpenGL textura invertida

El problema que tengo es que la textura se invierte verticalmente, si mi textura es "v", el resultado actual es "^".

Quiero ajustar la imagen tomada desde la cámara web a mi plano (2x2). La esquina inferior izquierda es -1, -1 y la esquina superior derecha es 1,1.

El código es:

const int VIEWPORT_WIDTH = 640; 
const int VIEWPORT_HEIGHT = 480; 
const int KEY_ESCAPE = 27; 

CvCapture* g_Capture; 
IplImage* image; 
GLint g_hWindow; 

GLvoid InitGL(); 
GLvoid OnDisplay(); 
GLvoid OnReshape(GLint w, GLint h); 
GLvoid OnKeyPress (unsigned char key, GLint x, GLint y); 

int main(int argc, char* argv[]) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 

    g_hWindow = glutCreateWindow("Image"); 

    image = cvLoadImage("average.jpg", 1); 
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image->width, image->height, GL_RGB, GL_UNSIGNED_BYTE, image->imageData); 

    InitGL(); 

    glutMainLoop(); 

    return 0; 
} 

GLvoid InitGL() 
{ 
    glClearColor (0.0, 0.0, 0.0, 0.0);  

    glutDisplayFunc(OnDisplay);  
    glutReshapeFunc(OnReshape);  
    glutKeyboardFunc(OnKeyPress);  
}  

GLvoid OnDisplay(void)  
{  
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_TEXTURE_2D); 

    glPushMatrix(); 
     glTranslatef(0.0f, 0.0f, -2.5f); 

     glBegin(GL_QUADS); 

      glTexCoord2f(0.0f, 0.0f); 
      glVertex3f(-1.0f,-1.0f, 1.0f);  

      glTexCoord2f(1.0f, 0.0f); 
      glVertex3f(1.0f,-1.0f, 1.0f); 

      glTexCoord2f(1.0f, 1.0f); 
      glVertex3f(1.0f, 1.0f, 1.0f); 

      glTexCoord2f(0.0f, 1.0f); 
      glVertex3f(-1.0f, 1.0f, 1.0f); 

     glEnd(); 
    glPopMatrix(); 

    glutSwapBuffers(); 
} 

GLvoid OnReshape(GLint width, GLint height) 
{ 
    if (height==0) 
     height=1; 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    glViewport(0, 0, width, height); 
    gluPerspective(45.0f,(GLfloat)width/(GLfloat)height, 1.0f, 10.0f); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(0.0, 0.0, 0.0, 0.0, 0.0, -6.0, 0.0f, 1.0f, 0.0f); 
} 

GLvoid OnKeyPress(unsigned char key, int x, int y) 
{ 
    switch (key) { 
     case KEY_ESCAPE: 
      cvReleaseImage(&image); 
      glutDestroyWindow(g_hWindow); 
      exit(0); 
      break; 
    } 
    glutPostRedisplay(); 
} 

cierto. En este código, estoy cargando una imagen en lugar de obtener desde la cámara web.

¿Alguna sugerencia?

+2

Cambie los últimos parámetros de su glTexCoord2f-calls (0.0f-> 1.0f y viceversa) – esaj

Respuesta

18

Da la vuelta a las coordenadas de la textura en el quad que estás renderizando. OpenGL almacena la textura "al revés" de lo que la mayoría de la gente cree que sería, por lo que la forma más sencilla de manejarlo es simplemente trabajar con OGL.

 glTexCoord2f(0.0f, 1.0f); 
     glVertex3f(-1.0f,-1.0f, 1.0f);  

     glTexCoord2f(1.0f, 1.0f); 
     glVertex3f(1.0f,-1.0f, 1.0f); 

     glTexCoord2f(1.0f, 0.0f); 
     glVertex3f(1.0f, 1.0f, 1.0f); 

     glTexCoord2f(0.0f, 0.0f); 
     glVertex3f(-1.0f, 1.0f, 1.0f); 

debería hacerlo, creo.