2015-01-18 2 views
0

openCV로 웹캠에서 사진을 캡처하고 있습니다. 그런 다음 프레임을 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 코어 프로필을 요청하고 있습니다. 그러나 사용중인 도면 코드는 고정 기능 파이프 라인 인 이있는 즉시 모드이며 코어 프로파일에서는 사용할 수 없습니다. 기본적으로 현대 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); 

이렇게는 운영 체제 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"을 넣고 잠시 동안 텍스처를로드하십시오.

(내 영어로는 유감입니다)

관련 문제