【问题标题】:OpenCV C API not allowing camera release and reopeningOpenCV C API 不允许相机释放和重新打开
【发布时间】:2014-11-09 07:52:33
【问题描述】:

我刚刚在一台新电脑上安装了 Ubuntu 14.04 和 openCV 2.4.9。

我有一个工作代码,有时会关闭最后一个 cvVideoCapture 并打开另一个,它可能有也可能没有不同的索引:

CvCapture* capture;
capture = cvCaptureFromCAM(1);

...

cvReleaseCapture(&capture);
capture = cvCaptureFromCAM(0);

这段代码曾经在 Ubuntu 12.0.4 和 OpenCV 2.4 上完美运行。? (我不确定哪个版本,但它是一年前的旧版本)。现在它输出错误

HIGHGUI ERROR: V4L: device /dev/video0: Unable to open for READ ONLY

另一方面,C++ API 的等效项也可以:

VideoCapture cap;
cap.open(1);

...

cap.release();
cap.open(0);

【问题讨论】:

  • 文档说“在 C API 中,当你完成视频处理后,使用 cvReleaseCapture(), ... 发布 CvCapture 结构”docs.opencv.org/modules/highgui/doc/…
  • 我会试一试并删除所有 cvReleaseCapture()
  • 为什么要删除它们?正如文档所述,您应该将cvReleaseCapture() 用于CvCapture 实例。也许cvRelease 也应该有效,但文档对此并不清楚。
  • 我查看了 opencv 源代码,但没有发现 2.4 和 2.4.9 之间的相关变化。但是从 2.4.9 到 3.0.0 发生了很大的变化。如果您在开头也使用ID = 0 打开相机,它是否有效,例如capture = cvCaptureFromCAM(0); 在第二行?

标签: c++ c opencv ubuntu


【解决方案1】:

您可以为每个打开的相机设备使用不同的名称。如下面的代码。试试这个。

 VideoCapture cap,cap1;
    cap.open(1);

    ...

    cap.release();
    cap1.open(0);

【讨论】:

    【解决方案2】:

    经过一些实验,我确信cvRelease 绝对不是为了释放CvCapture 实例。我收到有关不同指针类型的编译器警告。也许您应该使用一些额外的标志进行编译。你肯定必须使用cvReleaseCapture(&capture),就像文档中所说的那样。我不确定这是否可以解决您的问题,也许您需要提供更多信息。

    CvCapture* capture;
    capture = cvCaptureFromCAM(1);
    
    cvReleaseCapture(&capture);
    capture = cvCaptureFromCAM(0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 2015-05-13
      相关资源
      最近更新 更多