2014-01-25 1 views
0

OpenCV 및 freeglut으로 작업하려고했습니다.OpenCV VideoCapture는 glutDisplayFunc 콜백에 대한 첫 번째 호출에서만 빈 프레임을 반환합니다.

이 프로그램은 WebCam에서 이미지를 캡처하고 OpenCV로 이미지를 처리하며 처리 된 이미지에 따라 OpenGL로 3D 개체를 그리는 작업을 포함합니다.

OpenCV 루틴 만 사용할 때 완벽하게 작동합니다.

메인 루프가 GLUT에 의해 제어 될 때 문제가 발생합니다. 에 등록 된 콜백 내에서 프레임을 잡으려고 할 때 glutDisplayFunc() 반환 된 이미지가 비어 있습니다.

그러나 이상하게도 콜백에서 프레임을 가져올 때 glutIdleFunc()으로 등록하면 틀을 성공적으로 반환합니다.

주위를 낙서 한 후에 나는 display()의 첫 번째 호출에서 프레임을 캡처 할 수없고 두 번째 호출 후에 작동한다는 것을 알아 냈습니다.

현재 내 코드는 idle() 함수 내부의 프레임을 쿼리하고 있습니다.

그런 배경에 관해서는 몇 가지 질문이 있습니다.

  1. 왜 이런 일이 발생합니까? VideoCapture가 웹캠에 대한 전체 액세스 권한을 획득하기 전에 프로그램이 display() 안에 있기 때문에 발생합니까? 아니면 순수한 하드웨어 문제입니까?
  2. 안전한가요?idle() 내에서 프레임을 잡는 것에 대해 완벽하게 괜찮 으면 사용하는 것이 안전할까요?
  3. 그렇다면 해결 방법이 있습니까?이 방법이 안전하지 않은 경우 누군가이 문제를 다루는 또 다른 방법을 알려 주시기 바랍니다.

이 프로그램은 OS X 버전 10.9.1를 기반으로 도서관 인 사용이

  • 여기 freeglut 2.0.1

OpenCV의 2.4.7.0

  • 는 단순화 된 버전입니다 내 코드 :

    #include <opencv2/opencv.hpp> 
    #include <GL/freeglut.h> 
    #include <iostream> 
    
    cv::VideoCapture capture; 
    cv::Mat render; 
    
    void display() 
    { 
        std::cerr << "Grabbing frame in display()" << std::endl; 
    
        capture >> render; // This does not work on first call 
    
        if(render.empty()) { 
        std::cerr << "Error: Grabbing empty frame in display()" << std::endl; 
        } 
    } 
    
    void idle() 
    { 
        std::cerr << "Grabbing frame in idle()" << std::endl; 
    
        capture >> render; // This always works 
    
        if(render.empty()) { 
        std::cerr << "Error: Grabbing empty frame in idle()" << std::endl; 
        } 
    
        glutPostRedisplay(); 
    } 
    
    int main(int argc, char* argv[]) 
    { 
        glutInit(&argc, argv); 
        glutInitDisplayMode(GLUT_RGBA); 
        glutInitWindowSize(640, 480); 
        int debug_window = glutCreateWindow("Debug"); 
        glutDisplayFunc(display); 
        glutIdleFunc(idle); 
    
        capture.open(0); 
    
        if(!capture.isOpened()) { 
        std::cerr << "Error: Failed to open camera" << std::endl; 
        exit(1); 
        } 
    
        glutMainLoop(); 
    
        return 0; 
    } 
    
  • 답변

    0

    알려진 문제.

    일부 부주의 웹캠 드라이버는 빈을 반환합니다. 첫 번째 프레임, 예열 또는 무언가.

    전에 프레임을 캡처하려고 시도합니다. 유휴 루프에 들어가기

    관련 문제