2014-01-25 46 views
0

我一直在嘗試使用OpenCV和freeglut。OpenCV VideoCapture僅在第一次調用glutDisplayFunc時返回空幀回調

該程序涉及從WebCam捕獲圖像,使用OpenCV處理圖像,並根據處理後的圖像使用OpenGL繪製3D對象。

當我只使用OpenCV例程時,它工作得很好。

當主迴路變爲由GLUT控制時出現問題。當我嘗試從回調中獲取幀時,我註冊了glutDisplayFunc()返回的圖像爲空。

奇怪的是,當我從回調中抓取一個幀時,我註冊了glutIdleFunc()它成功返回一個幀。

經過塗鴉後,我發現在第一次調用display()時無法捕獲幀,並在第二次調用後工作。

目前我的代碼是查詢idle()函數中的一個幀。

關於這樣的背景我有幾個問題。

  1. 這是爲什麼發生?是否因爲程序在display()內停頓,然後VideoCapture完全訪問攝像頭?或者這純粹是一個硬件問題?
  2. 這是安全嗎?我完全可以從idle()以內抓取一幀,但這種方法安全嗎?
  3. 如果不是這樣,是否有解決方法?如果這種方法不安全,可能有人請以另一種處理此問題的方式通知我?

該計劃是建立在OS X 10.9.1版本和庫正在使用的是

  • OpenCV的2.4.7.0
  • freeglut 2.0.1

這裏是簡化版我的代碼:

#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

已知問題。

一些sl web的攝像頭驅動程序返回第一幀,熱身或什麼。

只是試圖捕獲1幀,之前你進入空閒循環

相關問題