2015-12-04 24 views
2

我目前使用的OpenCV 2.3.1与Visual Studio 2008。我试图读取使用VideoCapture从哈帕克的Usb活2帧,但我遇到了一个奇怪的问题。下面是我的代码的相关部分:OpenCV的VideoCapture后才能正常工作断点

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对象开始阅读框架正确)?

注:在运行可执行文件没有给出任何的问题,所以我张贴这个问题是出于好奇。

回答

2

我相信你的代码试图显示图像(里面是空的),你的相机准备好了。试着慢下来一两秒钟,首先包括像文件:如果您使用的是C++与低于11版

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

#include <chrono> 
#include <thread> 

然后你while语句之前,添加此行,那么sleep_for方法可能会有所不同。请参考here

+0

如果你不想使用'boost'或** C++ 11 **在您的项目(据我所知,您可以使用** ** VS2008没有** C++ 11 **支持),你可以使用'cv :: waitKey(2000)'来达到同样的目的。 – avtomaton

+0

我已经尝试在每行代码执行某些操作后添加'cv :: waitKey(1000)'和'Sleep(1000)',但我仍然获得相同的灰色屏幕。不知何故,进入调试模式似乎不仅仅是一个线程收益。 –

+0

在''howhow'命令之前试一下这行,并告诉我们输出:'std :: cout <<“捕获帧的大小是:”<< frame.size()<< std :: endl;' – Derman

0

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

现在有两个选择,你可以做什么@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; 
} 

我看不出有任何理由为什么这个代码不应该开始展示框架,一旦他们从avaliable相机

+0

I我试图检查空帧,但它们不是空的。刚刚装满导致灰屏的垃圾数据。 我也弄不明白,特别是因为可执行文件没有任何问题。 –

+0

奇怪。这似乎是一个非常不可重复的错误。你确定你所有正确的编解码器和视频库链接好吗? – GPPK