2011-03-15 4 views
12

웹캠의 입력을 OpenGL의 평면에 매핑하려고합니다. OpenCV를 사용하여 웹캠에서 이미지를 가져옵니다.OpenGL 텍스처가 반전되었습니다.

내가 가지고있는 문제는 텍스처가 수직으로 반전되어 있고 텍스처가 "v"이면 현재 결과가 "^"입니다.

웹캠에서 찍은 이미지를 비행기 (2x2)에 맞추고 싶습니다. 그 왼쪽 하단 모서리는 -1, -1이고 오른쪽 상단 모서리는 1,1입니다.

코드는 다음과 같습니다 BTW

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(); 
} 

. 이 코드에서는 웹캠에서 이미지를로드하는 대신 이미지를로드하고 있습니다.

의견이 있으십니까?

+2

glTexCoord2f 호출의 마지막 매개 변수를 바꿉니다 (0.0f-> 1.0f 및 그 반대) – esaj

답변

18

렌더링중인 쿼드에서 텍스처 좌표를 뒤집습니다. OpenGL은 대부분의 사람들이 생각한대로 "거꾸로"텍스처를 저장하기 때문에 가장 간단한 방법은 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); 

해야한다고 생각합니다.

관련 문제