无法使用 OpenCV 从辅助网络摄像头的 VideoCapture 读取帧

2024-02-04

Code:

与主网络摄像头(设备 0)完美配合的简单示例:

VideoCapture cap(0);

if (!cap.isOpened()) {
     std::cout << "Unable to read stream from specified device." << std::endl;
     return;
}

while (true)
{
    // retrieve the frame:
    Mat frame;
    if (!cap.read(frame)) {
        std::cout << "Unable to retrieve frame from video stream." << std::endl;
        break;
    }
    // display it:
    imshow("MyVideo", frame);

    // check if Esc has been pressed:
    if (waitKey(1) == 27) {
        break;
    }
    // else continue:
}

cap.release();

Problem:

我有第二个网络摄像头,我想使用它。但是,当我更换VideoCapture cap(0); with VideoCapture cap(1);, 流已正确打开(或者至少cap.isOpened()回报true) but the cap.read(frame)来电返回false我不知道为什么。

我尝试过的:

  • 我一直在尝试玩VideoCapture的设置有点像调用:

    cap.set(CV_CAP_PROP_FORMAT, CV_8UC3);
    

    诸如此类的随机事情,但似乎没有任何帮助。

  • 我还发现了这个:VideoCapture::读取未压缩视频失败(错误#2281) http://code.opencv.org/issues/2281,这似乎在版本 2.4.7 上得到了解决。但我刚刚将 OpenCV 更新到 2.4.8,但它仍然不起作用...

  • 我尝试使用 AMCap 从该相机捕获原始视频,将其另存为aaa.avi文件并构建VideoCapture通过致电:

    VideoCapture cap("aaa.avi");
    

    它可以工作(同时从文件中读取)...我需要的是实时视图的实时处理。

硬件、操作系统、软件详细信息:

我的硬件:带有内置网络摄像头、始终完美运行的 HP ProBook 4510s
+ 外部网络摄像头 CANYON CNR-FWCII3,操作系统将其称为“USB 视频设备”(麻烦的一个) 操作系统、软件:Windows 8.1 Pro x86、Visual Studio 2012 Pro、OpenCV 2.4.8 ~ 使用 vc11 构建

问题:

  1. 我错过了什么吗?
  2. 我还有什么可以做的吗?
  3. 至少有什么方法可以检索有关问题实际情况的一些附加信息吗?

... OpenCV 的 API 在这种情况下似乎相当糟糕,并且在人们似乎面临类似问题的地方,有人声称它是“操作系统/硬件依赖”作为借口。

任何帮助将不胜感激。


一段时间后,我发现这始终只是第一个电话read尽管这种行为的真正原因仍然未知,但失败并跳过第一帧开始正常工作。

Later 詹姆斯·巴尼特 https://stackoverflow.com/users/2197264/james-barnett(请参阅上面的评论)指出原因可能是相机需要一段时间才能准备好捕获,而我当前的解决方案看起来如下(C++11 的睡眠):

#include <chrono>
#include <thread>
...

VideoCapture cap(1);

// give camera some extra time to get ready:
std::this_thread::sleep_for(std::chrono::milliseconds(200));

if (!cap.isOpened()) {
     std::cout << "Unable to read stream from specified device." << std::endl;
     return;
}

while (true)
{
    // retrieve the frame:
    Mat frame;
    if (!cap.read(frame)) {
        std::cout << "Unable to retrieve frame from video stream." << std::endl;
        continue;
    }

    // display it:
    imshow("LiveStream", frame);

    // stop if Esc has been pressed:
    if (waitKey(1) == 27) {
        break;
    }
}

cap.release();

希望未来的访客会发现它有帮助:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 OpenCV 从辅助网络摄像头的 VideoCapture 读取帧 的相关文章

随机推荐