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

OpenCV VideoCapture working properly only after breakpoint

本文关键字:常工作 工作 VideoCapture 断点 OpenCV      更新时间:2023-10-16

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

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对象开始正确读取帧)?

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

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

#include <chrono>
#include <thread>

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

std::this_thread::sleep_for(std::chrono::milliseconds(2000));

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

相机有一个初始化期,因此您需要检查是否有空帧。

现在有两种选择,你可以按照@Derman的说法等待,但你怎么知道你需要等待多久?

或者,您可以检查空帧,如果它们不是空,则只显示窗口

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;
}

我看不出有什么理由不让这个代码在从相机可用后开始显示帧