C++ OpenCV VideoCapture仅在断点后才能正常工作
我目前正在Visual Studio 2008中使用OpenCV 2.3.1。我试图使用视频捕获技术读取HaupPage Usb Live-2的帧,但遇到了一个奇怪的问题。以下是我的代码的相关部分: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);
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;
}