opengl學習筆記(二):使用OpenCV來創建OpenGL窗口


通常的增強現實應用需要支持OpenGL的OpenCV來對真實場景進行渲染。從2.4.2版本開始,OpenCV在可視化窗口中支持OpenGL。這意味着在OpenCV中可輕松渲染任何3D內容。

若要在OpenCV中開始一個OpenGL窗口,需要做的第一件事是生成支持OpenGL的OpenCV。

在cmake的時候,應該設置標志:

cmake -D ENABLE_OPENGL=YES

 

如果現在有一個支持OpenGL的OpenCV庫,可用其創建第一個OpenGL窗口。OpenGL窗口的初始化由創建一個命名的窗口開始,這需要設置一個OpenGL標志:

string openGLWindowName = "OpenGL Test";
cv::namedWindow(openGLWindowName, WINDOW_OPENGL);

openGLWindowName是一個字符串變量,保存着窗口的名稱。
然后設置窗口大小


resizeWindow(openGLWindowName, 640, 480);

接下來需對此窗口設置上下文:

setOpenGlContext(openGLWindowName);

現在窗口就可以使用了。為了在窗口上畫一些東西,應用以下方法注冊一個回調函數:

setOpenGlDrawCallback(openGLWindowName, on_opengl, NULL);

該回調函數將被稱為回調窗口。第一個參數為窗口名,第二個參數為回調函數,第三個可選參數將被傳遞給回調函數。

on_opengl是一個繪圖函數,例如:

void on_opengl(void* param)
{
    glLoadIdentity();
    glTranslated(0.0, 0.0, -1.0);
    glRotatef( 55, 1, 0, 0 );
    glRotatef( 45, 0, 1, 0 );
    glRotatef( 0, 0, 0, 1 );
    static const int coords[6][4][3] = {
        { { +1, -1, -1 }, { -1, -1, -1 }, { -1, +1, -1 }, { +1, +1, -1 } },
        { { +1, +1, -1 }, { -1, +1, -1 }, { -1, +1, +1 }, { +1, +1, +1 } },
        { { +1, -1, +1 }, { +1, -1, -1 }, { +1, +1, -1 }, { +1, +1, +1 } },
        { { -1, -1, -1 }, { -1, -1, +1 }, { -1, +1, +1 }, { -1, +1, -1 } },
        { { +1, -1, +1 }, { -1, -1, +1 }, { -1, -1, -1 }, { +1, -1, -1 } },
        { { -1, -1, +1 }, { +1, -1, +1 }, { +1, +1, +1 }, { -1, +1, +1 } }
    };
    for (int i = 0; i < 6; ++i) {
                glColor3ub( i*20, 100+i*10, i*42 );
                glBegin(GL_QUADS);
                for (int j = 0; j < 4; ++j) {
                        glVertex3d(0.2 * coords[i][j][0], 0.2 * coords[i][j][1], 0.2 * coords[i][j][2]);
                }
                glEnd();
    }
}

這個函數可以繪制一個長方體,程序執行效果如下所示:

 

同樣的,我們可以寫其他的繪制函數

void onDraw(void* param)
{
    // Draw something using OpenGL here
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);   // background
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    glColor3f(1.0f, 0.0f, 0.0f);
    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);  // draw rect
    glFlush();
}

此函數的作用是在藍色背景下繪制一個紅色方塊,程序運行效果如下:

 

 完整代碼下載地址:https://download.csdn.net/download/buaa_zn/10476956

 














免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM