OpenCV VideoCapture只有在断点后才能正常工作
OpenCV VideoCapture working properly only after breakpoint
我目前正在Visual Studio 2008中使用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对象开始正确读取帧)?
注意:运行可执行文件也没有问题,所以我发布这个问题是出于好奇。
我相信您的代码正在尝试在相机准备好之前显示图像(它是空的)。试着放慢速度一两秒钟,首先包括以下文件:
#include <chrono>
#include <thread>
然后在while
语句之前,添加以下行:
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
如果您使用的C++版本低于11,那么sleep_for
方法可能会有所不同。请参阅此处的参考资料。
相机有一个初始化期,因此您需要检查是否有空帧。
现在有两种选择,你可以按照@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;
}
我看不出有什么理由不让这个代码在从相机可用后开始显示帧
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程