【问题标题】:OpenCV VideoCapture returns an empty frame only in first call to glutDisplayFunc callbackOpenCV VideoCapture 仅在第一次调用 glutDisplayFunc 回调时返回一个空帧
【发布时间】:2014-01-25 17:44:28
【问题描述】:

我一直在尝试使用 OpenCV 和 freeglut。

该程序涉及从网络摄像头捕获图像,使用 OpenCV 处理图像,并根据处理后的图像使用 OpenGL 绘制 3D 对象。

当我只使用 OpenCV 例程时,它工作得非常好。

当主循环被 GLUT 控制时,问题就出现了。当我尝试从使用 glutDisplayFunc() 注册的回调中抓取帧时,返回的图像为空。

然而,奇怪的是,当我从使用 glutIdleFunc() 注册的回调中获取帧时,它成功返回了一个帧。

在到处乱画之后,我发现在第一次调用 display() 时无法捕获帧,而在第二次调用后可以正常工作。

目前我的代码正在查询 idle() 函数内的框架。

关于这样的背景,我有几个问题。

  1. 为什么会发生这种情况? 是因为在 VideoCapture 获得对网络摄像头的完全访问权限之前程序在 display() 中停止了吗?还是这纯粹是硬件问题?
  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;
}

【问题讨论】:

    标签: c++ opengl opencv webcam glut


    【解决方案1】:

    已知问题。

    一些草率的网络摄像头驱动程序返回 第一帧、预热或其他内容。

    尝试捕获 1 帧,在进入空闲循环之前

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 2021-11-04
      • 2020-06-21
      • 1970-01-01
      • 2018-09-20
      相关资源
      最近更新 更多