0
我一直在嘗試使用OpenCV和freeglut。OpenCV VideoCapture僅在第一次調用glutDisplayFunc時返回空幀回調
該程序涉及從WebCam捕獲圖像,使用OpenCV處理圖像,並根據處理後的圖像使用OpenGL繪製3D對象。
當我只使用OpenCV例程時,它工作得很好。
當主迴路變爲由GLUT控制時出現問題。當我嘗試從回調中獲取幀時,我註冊了glutDisplayFunc()返回的圖像爲空。
奇怪的是,當我從回調中抓取一個幀時,我註冊了glutIdleFunc()它成功返回一個幀。
經過塗鴉後,我發現在第一次調用display()時無法捕獲幀,並在第二次調用後工作。
目前我的代碼是查詢idle()函數中的一個幀。
關於這樣的背景我有幾個問題。
- 這是爲什麼發生?是否因爲程序在display()內停頓,然後VideoCapture完全訪問攝像頭?或者這純粹是一個硬件問題?
- 這是安全嗎?我完全可以從idle()以內抓取一幀,但這種方法安全嗎?
- 如果不是這樣,是否有解決方法?如果這種方法不安全,可能有人請以另一種處理此問題的方式通知我?
該計劃是建立在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;
}