【发布时间】:2016-12-15 20:40:14
【问题描述】:
我使用的是 OpenCV 3.1,我尝试运行如下简单代码(主函数):
cv::VideoCapture cam;
cv::Mat matTestingNumbers;
cam.open(0);
if (!cam.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; }
while (cam.read(matTestingNumbers))
{
cv::imshow("matTestingNumbers", matTestingNumbers);
cv::waitKey(5000);
}
当我移动相机时,代码似乎没有捕获并显示当前帧,而是显示从前一个位置捕获的所有帧,然后才从新位置显示。
因此,当我捕捉墙壁时,它会以正确的延迟显示正确的帧(墙壁本身),但是,当我将相机转动到计算机上时,我首先看到墙壁的大约 3 帧,然后才看到计算机,框架好像卡住了。
我尝试使用 videoCapture.set() 函数并将 FPS 设置为 1,并尝试将捕获方法切换为 cam >> matTestingNumbers (以及根据此更改的主要功能的其余部分)但是没有任何帮助,我仍然有“卡住”的框架。
顺便说一句,这些是我在网上找到的解决方案。
我可以做些什么来解决这个问题?
谢谢你,丹。
编辑:
我尝试如下检索帧:
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int, char**)
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat frame;
namedWindow("edges",1);
for(;;)
{
cap.grab();
if (waitKey(11) >= 0)
{
cap.retrieve(frame);
imshow("edges", frame);
}
}
return 0;
}
但是,它给出了结果(当我将相机对准一个点并按下一个键时,它会显示另一点之前捕获的另一帧)。
这就像你试图描绘一个人然后另一个人,但是当你描绘第二个人时,你会得到第一个人的照片,这是没有意义的。
然后,我尝试了以下方法:
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int, char**)
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat frame;
namedWindow("edges",1);
for(;;)
{
cap >> frame;
if (waitKey(33) >= 0)
imshow("edges", frame);
}
return 0;
}
它按预期工作。
【问题讨论】:
-
仍然不确定这是否是相机/驱动程序/openCV 中的缓冲,但您不能确定捕获的帧是最新的...您应该阅读所有帧而不long sleep 或 waitKey 和/或将捕获帧率调整为您的目标 fps。
-
正如我在问题中所写,我尝试这样做(set()函数)但结果仍然没有改变,我肯定需要延迟这个程序,所以我不能评论长延迟。
-
一个捕获线程(无需等待即可更新)和一个处理线程(等待一段时间然后处理最新捕获的图像)的多线程呢?
标签: c++ opencv video-capture