C++ OpenCV VideoCapture仅在断点后才能正常工作

C++ OpenCV VideoCapture仅在断点后才能正常工作,c++,debugging,opencv,C++,Debugging,Opencv,我目前正在Visual Studio 2008中使用OpenCV 2.3.1。我试图使用视频捕获技术读取HaupPage Usb Live-2的帧,但遇到了一个奇怪的问题。以下是我的代码的相关部分: VideoCapture vc(0); if (!vc.isOpened()) return -1; Mat frame; namedWindow("Camera"); bool success; while (true) { success = vc.read(frame);

我目前正在Visual Studio 2008中使用OpenCV 2.3.1。我试图使用视频捕获技术读取HaupPage 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>

如果你使用的C++版本低于11,那么对于方法可能会有所不同。参考一下

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

现在有两种选择,你可以按照@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;
}
VideoCapture vc(0);
如果(!vc.isopend())//如果不成功,退出程序
{

cout如果您不想在项目中使用
boost
或C++11(据我所知,您使用的VS2008不支持C++11),您可以使用
cv::waitKey(2000)
达到同样的目的。我尝试添加'cv::waitKey(1000)`和'Sleep(1000)''在每一行代码完成某些操作后,我仍然会看到相同的灰色屏幕。不知何故,进入调试模式似乎会触发一些不只是线程产量的事情。在您的
ìmshow
命令之前尝试这一行,并告诉我们有关输出的信息:
std::cout我尝试过检查空帧,但它们不是空的。Just填充了垃圾数据,导致了灰色屏幕。我也无法理解,尤其是因为可执行文件没有任何问题。真奇怪。这似乎是一个非常不可重复的错误。你确定你链接了所有正确的编解码器和视频库吗?
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;
}