2011-01-31 5 views
4

openCV 전체 화면에서 이미지를 그립니다.이 이미지는 60fps에서 큰 이미지이므로 openCV GUI보다 빠른 방법이 필요했습니다. OpenGL을 사용glTexImage2D 다중 이미지

내가 수행 측면 -을 확장하기 위해 OpenGL 하드웨어를 사용하여 :

void paintGL() { 
    glClear (GL_COLOR_BUFFER_BIT); 
    glClearColor (0.0,0.0,0.0,1.0); 

    glDisable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0,width,height,0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glEnable(GL_TEXTURE_2D); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data); 
    glBegin(GL_QUADS); 
    glTexCoord2i(0,0); glVertex2i(0,height); 
    glTexCoord2i(0,1); glVertex2i(0,0); 
    glTexCoord2i(1,1); glVertex2i(width,0); 
    glTexCoord2i(1,0); glVertex2i(width,height); 
    glEnd(); 
    glDisable(GL_TEXTURE_2D); 
} 

가 지금은 두 개의 이미지를 측면을 그리려.
쿼드 크기를 변경하여 이미지 축소 가능 glTexImage2()로 두 이미지를로드하는 방법을 이해할 수 없으므로 이미지와 관련된 핸들 또는 ID가 없기 때문에 이해할 수 없습니다.

답변

11

다른 질감을 추가하는 방법을 볼 수없는 이유는 게시 한 코드에 중요한 기능 두 개 (glGenTexturesglBindTexture)가 누락 되었기 때문입니다. 첫 번째는 OpenGL 컨텍스트에서 텍스처 객체를 생성합니다 (그래픽 하드웨어에 텍스처가있는 위치). 두 번째 함수는 후속 호출 (glTex ..)에 영향을주는 텍스처 객체 중 하나를 "선택"합니다.

우선 glTexParameteri 및 glTexImage2D와 같은 함수는 모든 렌더링 루프에서 다시 호출 할 필요가 없습니다. 그러나 이미지가 항상 변경되기 때문에 작업을 수행해야합니다. 기본적으로 코드에서 사용되는 텍스처 객체는 0 번째 객체 (기본값의 예약 된 객체)입니다. 두 개의 텍스처 오브젝트를 생성하고 원하는 결과를 얻기 위해 하나씩 바인딩해야합니다.

GLuint tex_obj[2]; //create two names for the texture (should not be global variables, but just for sake of this example). 

void initGL() { 
    glClearColor (0.0,0.0,0.0,1.0); 

    glDisable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0,width,height,0); 

    glEnable(GL_TEXTURE_2D); 
    glGenTextures(2,tex_obj); //generate 2 texture objects with names tex_obj[0] and [1] 

    glBindTexture(GL_TEXTURE_2D, tex_obj[0]); //bind the first texture 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //set its parameters 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

    glBindTexture(GL_TEXTURE_2D, tex_obj[1]); //bind the second texture 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //set its parameters 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
} 

void paintGL() { 
    glClear (GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glBindTexture(GL_TEXTURE_2D,tex_obj[0]); //bind the first texture. 
    //then load it into the graphics hardware: 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width0, height0, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data0); 
    glBegin(GL_QUADS); 
    glTexCoord2i(0,0); glVertex2i(0,height); //you should probably change these vertices. 
    glTexCoord2i(0,1); glVertex2i(0,0); 
    glTexCoord2i(1,1); glVertex2i(width,0); 
    glTexCoord2i(1,0); glVertex2i(width,height); 
    glEnd(); 

    glBindTexture(GL_TEXTURE_2D, tex_obj[1]); //bind the second texture. 
    //then load it into the graphics hardware: 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width1, height1, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data1); 
    glBegin(GL_QUADS); 
    glTexCoord2i(0,0); glVertex2i(0,height); //you should probably change these vertices. 
    glTexCoord2i(0,1); glVertex2i(0,0); 
    glTexCoord2i(1,1); glVertex2i(width,0); 
    glTexCoord2i(1,0); glVertex2i(width,height); 
    glEnd(); 
} 

기본적으로 어떻게 수행됩니까? 그러나 OpenGL에 대한 지식은 약간 구식이므로 약간 더 효율적인 방법이있을 수 있다고 경고해야합니다 (적어도 glBegin/glEnd는 C++에서 사용되지 않으며 VBO로 대체되었습니다).

+0

가 작동하지 않습니다 페인트 호출을 기억 - 나는 gluOrtho2D을 할 필요가 (0, 폭, 높이, 0); 모든 페인트에서 또는 아무 것도 나타나지 않습니다 - 그리고 그것은 내가 먼저하는 glTexImage2D() 중 하나만 칠해줍니다. 특정 glTexImage2D()를 텍스처 ID와 연관시키는 것은 무엇입니까? –

+0

좋아, 나는 멍청이야 - 두 번째 이미지가 틀렸어 (시작과 끝 너비는 같았어!) Quads가 있었지만 모든 호출마다 gluOrtho2D (전체 창 코드)를 수행해야한다. –

+2

텍스처가 만들어지면, glTexSubImage2D를 사용하여 데이터를 업데이트하십시오. 매번 전체 재 초기화를 수행하는 glTexImage보다 훨씬 빠릅니다. 실제로 glTexImage의 data 매개 변수에 NULL을 전달하여 나중에 glTexSubImage를 통해 데이터를 초기화 한 다음 제공하려는 경우에만 사용할 수 있습니다. – datenwolf

2

OpenGL은 상태 머신입니다. 상태에 넣으면 명령을 내리고 나중에 상태를 재생합니다.

질감에 대한 좋은 점 중 하나는 페인트 호출 밖에서 할 수 있다는 것입니다. 이미지 처리 단계에서 이미지 1을 생성하면 그 시점에서 카드에 이미지를로드 할 수 있습니다.

glBindTexture(GL_TEXTURE_2D,tex_obj[1]); // select image 1 slot 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width1, height1, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data1); // load it into the graphics card memory 

그리고는

glBindTexture(GL_TEXTURE_2D,tex_obj[1]); // select pre loaded image 1 
glBegin(GL_QUADS); // draw it 
관련 문제