我目前正在使用OpenCV 2.3.1和Visual Studio 2008.我试图使用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对象开始正确读取帧)?
注意:运行可执行文件也没有问题,所以我出于好奇而发布了这个问题。
答案 0 :(得分:2)
我相信你的代码试图在你的相机准备好之前显示图像(它是空的)。尝试减速一到两秒,首先包括如下文件:
#include <chrono>
#include <thread>
然后在while
语句之前添加以下行:
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
如果您使用版本低于11的C ++,则sleep_for
方法可能会有所不同。参考here。
答案 1 :(得分: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;
}
我认为没有任何理由说明为什么这些代码一旦可以从相机中显示就不应该开始显示