首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV VideoCapture只有在断点后才能正常工作

OpenCV VideoCapture只有在断点后才能正常工作
EN

Stack Overflow用户
提问于 2015-12-04 13:23:23
回答 2查看 574关注 0票数 2

我目前使用的是带有Visual Studio2008的OpenCV 2.3.1。我试图用VideoCapture读取Hauppauge Usb Live-2中的帧,但遇到了一个奇怪的问题。下面是我的代码的相关部分:

代码语言:javascript
复制
VideoCapture vc(0);

if (!vc.isOpened()) return -1;

Mat frame;
namedWindow("Camera");

bool success;

while (true)
{
    success = vc.read(frame);

    if (!success) continue;

    imshow("Camera", frame);

    if (waitkey(30) == 27) break;
}

最初,在调试模式下运行我的代码时,显示捕获帧的窗口仅显示纯灰色图像。为了调试我的程序,我在代码开头放置了断点断点,并遍历了每一行。然而,在imshow上,窗口开始正确地显示抓取的帧,显示我的相机捕捉到的内容。随后,我意识到,只要我在打开设备和将其显示在窗口之间进入一个断点,框架就会开始正常显示。

有没有人知道进入断点会如何影响程序在调试模式下的执行(在这种情况下,允许VideoCapture对象开始正确地读取帧)?

注意:运行可执行文件也没有问题,所以出于好奇,我在此发布这个问题。

EN

回答 2

Stack Overflow用户

发布于 2015-12-04 15:46:25

我相信你的代码试图在你的相机准备好之前显示图像(它是空的)。尝试放慢速度一到两秒钟,首先包含如下文件:

代码语言:javascript
复制
#include <chrono>
#include <thread>

然后,在您的while语句之前添加以下行:

代码语言:javascript
复制
std::this_thread::sleep_for(std::chrono::milliseconds(2000));

如果您使用的C++版本低于11,那么sleep_for方法可能会有所不同。参考here

票数 2
EN

Stack Overflow用户

发布于 2015-12-04 16:13:10

相机有一个初始化周期,所以你需要检查是否有空帧。

现在有两个选择,你可以按照@Derman所说的做,然后等待,但是你怎么知道你需要等待多长时间呢?

或者,您可以检查空框架,并仅在它们不为空时显示窗口

代码语言:javascript
复制
VideoCapture vc(0);

if ( !vc.isOpened() )  // if not success, exit program
    {
        cout << "Cannot open the video file" << endl;
        return -1;
    }

Mat frame;
namedWindow("Camera");

bool success;
while (true)
{
    vc.read(frame);

    if(frame.empty()){
            std::cerr<<"frame is empty"<<std::endl;
            break;
        }

    imshow("Camera", frame);

    if (waitkey(30) == 27) break;
}

我看不出这段代码有什么理由不能在摄像头上显示这些帧

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34081435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档