我目前使用的是带有Visual Studio2008的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对象开始正确地读取帧)?
注意:运行可执行文件也没有问题,所以出于好奇,我在此发布这个问题。
发布于 2015-12-04 15:46:25
我相信你的代码试图在你的相机准备好之前显示图像(它是空的)。尝试放慢速度一到两秒钟,首先包含如下文件:
#include <chrono>
#include <thread>然后,在您的while语句之前添加以下行:
std::this_thread::sleep_for(std::chrono::milliseconds(2000));如果您使用的C++版本低于11,那么sleep_for方法可能会有所不同。参考here。
发布于 2015-12-04 16:13:10
相机有一个初始化周期,所以你需要检查是否有空帧。
现在有两个选择,你可以按照@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;
}我看不出这段代码有什么理由不能在摄像头上显示这些帧
https://stackoverflow.com/questions/34081435
复制相似问题