2015-01-18 3 views
0

Я снимаю изображение с веб-камеры с открытым кодом. Затем рамка должна быть преобразована в текстуру openGL и отображена на экране. Я получил следующий код, но окно остается черным. Я очень новичок в openGL и не имею больше идей, почему он не работает.Отображение изображения с веб-камеры с использованием openCV и openGL

int main() 
{ 
    int w = 800,h=600; 

    glfwInit(); 

    //configure glfw 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); 


    GLFWwindow* window = glfwCreateWindow(w, h, "OpenGL", NULL, nullptr); // windowed 
    glfwMakeContextCurrent(window); 

    glewExperimental = GL_TRUE; 
    glewInit(); 

    initializeCapturing(); 

    //init GL 
    glViewport(0, 0, w, h); // use a screen size of WIDTH x HEIGHT 
    glEnable(GL_TEXTURE_2D);  // Enable 2D texturing 

    glMatrixMode(GL_PROJECTION);  // Make a simple 2D projection on the entire window 
    glLoadIdentity(); 
    glOrtho(0.0, w, h, 0.0, 0.0, 100.0); 

    glMatrixMode(GL_MODELVIEW); // Set the matrix mode to object modeling 

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    glClearDepth(0.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the window 

    cv::Mat frame; 
    captureFromWebcam(frame,capture0); 


    /* OpenGL texture binding of the image loaded by DevIL */ 
    GLuint texid; 
    glGenTextures(1, &texid); /* Texture name generation */ 
    glBindTexture(GL_TEXTURE_2D, texid); /* Binding of texture name */ 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); /* We will use linear interpolation for magnification filter */ 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); /* We will use linear interpolation for minifying filter */ 
    glTexImage2D(GL_TEXTURE_2D, 0,3, frame.size().width, frame.size().height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); /* Texture specification */ 


    while(!glfwWindowShouldClose(window)) 
    { 
     glfwPollEvents(); 

     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) 
      glfwSetWindowShouldClose(window, GL_TRUE); 

     // Clear color and depth buffers 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glBindTexture(GL_TEXTURE_2D,texid); 
     glMatrixMode(GL_MODELVIEW);  // Operate on model-view matrix 

     /* Draw a quad */ 
     glBegin(GL_QUADS); 
      glTexCoord2i(0, 0); glVertex2i(0, 0); 
      glTexCoord2i(0, 1); glVertex2i(0, h); 
      glTexCoord2i(1, 1); glVertex2i(w, h); 
      glTexCoord2i(1, 0); glVertex2i(w, 0); 
     glEnd(); 
     glFlush(); 
     glfwSwapBuffers(window); 
    } 


    releaseCapturing(); 
    glfwTerminate(); 

    return 1; 
} 

и другие процедуры

cv::VideoCapture capture0; 
cv::VideoCapture capture1; 

void captureFromWebcam(cv::Mat &frame, cv::VideoCapture &capture) 
{ 
    capture.read(frame); 
} 

bool initializeCapturing() 
{ 
    capture0.open(0); 
    capture1.open(1); 

    if(!capture0.isOpened() | !capture1.isOpened()) 
    { 
     std::cout << "Ein oder mehrere VideoCaptures konnten nicht geöffnet werden" << std::endl; 

     if(!capture0.isOpened()) 
      capture0.release(); 
     if(!capture1.isOpened()) 
      capture1.release(); 
     return false; 
    } 

    return true; 
} 

void releaseCapturing() 
{ 
    capture0.release(); 
    capture1.release(); 
} 

ответ

3

Похоже, вы смешанные фрагменты нескольких кодов вы нашли в разных местах. Вы просматриваете OpenGL 3.2 core. Но код чертежа, который вы используете, - это немедленный режим с конвейером с фиксированной функцией, , который недоступен в профиле ядра. В основном вы запросили современный контекст GL, но код чертежа полностью устарел и больше не поддерживается версией GL, которую вы выбрали.

Как быстро исправить, вы можете просто удалить следующие строки:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); 
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 

Doing так должны предоставить вам некоторое наследие GL контекст или профиль совместимости некоторых современных условий, в зависимости от операционной системы GL осуществление вы используете. Тем не менее, вы можете ожидать от этого получить хотя бы OpenGL 2.1 таким образом (за исключением очень старого оборудования, не поддерживающего GL2 вообще, но даже это будет нормально для вашего кода). Остальная часть кода должна работать в таком контексте.

Я по-прежнему предлагаю вам изучить mordern GL вместо старого, устаревшего наследия, которое вы используете здесь.

+0

Вы знаете место GOOG выучить современный способ (веб-сайты, книги, ...)? Большинство учебных пособий и тем, как я нашел, были старыми. Правильно ли, что прежде всего glBegin() и glEnd() - старый код? Или glMatrixMode() и glViewport также устарели? –

+1

'glMatrixMode' также устарел,' glViewport' - нет. Что касается современного OpenGL, посмотрите на следующие сайты: [arcsynthesis.org/gltut/](http://arcsynthesis.org/gltut/), [open.gl] (http://open.gl) и [ opengl-tutorial.org] (http://www.opengl-tutorial.org/). – derhass

0

Вы не установили указатель из рамки.

glTexImage2D(GL_TEXTURE_2D, 0,3, frame.size().width, frame.size().height, 0, GL_RGB, GL_UNSIGNED_BYTE, (void*)frame.data()); /* Texture specification */ 

И с помощью этого кода вы получите только первый кадр.

Поместите «captureFromWebcam» и загрузите текстуру внутри.

(Извините за мой английский)

Смежные вопросы