gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:36:55 26 4
gpt4 key购买 nike

代码:

与主网络摄像头(设备 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();

问题:

我有第二个网络摄像头,我想使用它。但是,当我将 VideoCapture cap(0); 替换为 VideoCapture cap(1); 时,流被正确打开(或至少cap.isOpened() 返回 true) 但是 cap.read(frame) 调用返回 false 我无法找出原因。

我尝试过的:

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

    cap.set(CV_CAP_PROP_FORMAT, CV_8UC3);

    和诸如此类的随机内容,但似乎没有任何帮助。

  • 我还发现了这个:VideoCapture::read fails on uncompressed video (Bug #2281) , 这似乎在版本 2.4.7.. 上解决了.. 但是我刚刚将 OpenCV 更新到 2.4.8 并且它仍然不起作用......

  • 我已尝试使用 AMCap 从该摄像机捕获原始视频,将其保存为 aaa.avi 文件并通过调用构建 VideoCapture:

    VideoCapture cap("aaa.avi");

    它可以工作(从文件中读取时)...不过我需要的是使用实时 View 进行实时处理。

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

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

问题:

  1. 我是不是漏掉了什么?
  2. 还有什么我可以做的吗?
  3. 至少有什么方法可以检索一些关于实际问题的额外信息吗?

...在这种情况下,OpenCV 的 API 似乎很差,而且在人们似乎面临类似问题的任何地方,都有人声称它是“依赖操作系统/硬件”的借口。

我们将不胜感激。

最佳答案

一段时间后,我发现总是只有第一次调用 read 失败,跳过第一帧开始正常工作,尽管这种行为的真正原因仍然未知。

后来James Barnett (见上面的评论)指出,原因可能是相机准备好捕捉需要一段时间,我当前的解决方案看起来如下(C++11 的 sleep ):

#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();

希望 future 的一些访问者会觉得它有用:)

关于c++ - 无法使用 OpenCV 从辅助网络摄像头读取 VideoCapture 中的帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22019064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com