c++ - OpenGL纹理倒置

标签 c++ opengl opencv

我正在尝试将网络摄像头的输入映射到 OpenGL 中的平面。我正在使用 OpenCV 从网络摄像头获取图像。

我的问题是纹理是垂直反转的,如果我的纹理是“v”,那么当前结果是“^”。

我想让从网络摄像头拍摄的图像适合我的飞机 (2x2)。它的左下角是-1,-1,右上角是1,1。

代码是:

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

顺便说一句。在这段代码中,我正在加载图像,而不是从网络摄像头获取。

有什么建议吗?

最佳答案

在您正在渲染的四边形上翻转纹理坐标。 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);

我认为应该这样做。

关于c++ - OpenGL纹理倒置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5316529/

相关文章:

带有 Qt 的 C++ 缓冲区

opengl - 高级摩尔纹,HLSL/GLSL 程序纹理着色器中的图案减少 - 抗锯齿

python - 将图像从 float32 转换为 uint8 时,蒙版对象消失

c++ - 使用c++查找文件

c++ - 如何安全地检查空指针

c++ - 为 C/C++ 可执行文件自动生成目标文件(链接器)依赖项

python - 如何将 3d GLViewWidget 插入包含 2d PyQtGraph 绘图的窗口中

c# - 将图像从 unity 传递到 opencv

c++ - 使用 OpenCV 找到没有狭窄瓶颈的连续区域

c++ - 按值捕获的广义 lambda 始终位于同一地址