OpenCV 및 freeglut으로 작업하려고했습니다.OpenCV VideoCapture는 glutDisplayFunc 콜백에 대한 첫 번째 호출에서만 빈 프레임을 반환합니다.
이 프로그램은 WebCam에서 이미지를 캡처하고 OpenCV로 이미지를 처리하며 처리 된 이미지에 따라 OpenGL로 3D 개체를 그리는 작업을 포함합니다.
OpenCV 루틴 만 사용할 때 완벽하게 작동합니다.
메인 루프가 GLUT에 의해 제어 될 때 문제가 발생합니다. 에 등록 된 콜백 내에서 프레임을 잡으려고 할 때 glutDisplayFunc() 반환 된 이미지가 비어 있습니다.
그러나 이상하게도 콜백에서 프레임을 가져올 때 glutIdleFunc()으로 등록하면 틀을 성공적으로 반환합니다.
주위를 낙서 한 후에 나는 display()의 첫 번째 호출에서 프레임을 캡처 할 수없고 두 번째 호출 후에 작동한다는 것을 알아 냈습니다.
현재 내 코드는 idle() 함수 내부의 프레임을 쿼리하고 있습니다.
그런 배경에 관해서는 몇 가지 질문이 있습니다.
- 왜 이런 일이 발생합니까? VideoCapture가 웹캠에 대한 전체 액세스 권한을 획득하기 전에 프로그램이 display() 안에 있기 때문에 발생합니까? 아니면 순수한 하드웨어 문제입니까?
- 안전한가요?idle() 내에서 프레임을 잡는 것에 대해 완벽하게 괜찮 으면 사용하는 것이 안전할까요?
- 그렇다면 해결 방법이 있습니까?이 방법이 안전하지 않은 경우 누군가이 문제를 다루는 또 다른 방법을 알려 주시기 바랍니다.
이 프로그램은 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;
}