【问题标题】:OpenCV VideoCapture working properly only after breakpointOpenCV VideoCapture 仅在断点后才能正常工作
【发布时间】:2016-03-08 23:28:46
【问题描述】:

我目前正在使用带有 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 对象开始正确读取帧)?

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

【问题讨论】:

    标签: c++ debugging opencv


    【解决方案1】:

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

    #include <chrono>
    #include <thread>
    

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

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

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

    【讨论】:

    • 如果您不想在项目中使用boostC++11(据我了解,您使用 VS2008 C++11 支持),您可以将cv::waitKey(2000) 用于相同目的。
    • 我尝试在每行代码之后添加 'cv::waitKey(1000)` 和 'Sleep(1000)',但我仍然得到相同的灰屏。不知何故,进入调试模式似乎触发的不仅仅是线程屈服。
    • 在您的ìmshow 命令之前尝试这一行并告诉我们输出:std::cout &lt;&lt; "size of captured frame is: " &lt;&lt; frame.size() &lt;&lt; std::endl;
    【解决方案2】:

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

    现在有两种选择,您可以按照@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;
    }
    

    我看不出有任何理由说明此代码一旦从相机中可用就不应开始显示帧

    【讨论】:

    • 我试过检查空帧,但它们不是空的。只是充满了导致灰屏的垃圾数据。我也想不通,特别是因为可执行文件没有任何问题。
    • 多么奇怪。这似乎是一个非常不可重复的错误。你确定你有所有正确的编解码器和视频库链接好吗?
    猜你喜欢
    • 2017-11-16
    • 2023-03-18
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多