OpenCV "stuck" 帧与视频捕获

OpenCV "stuck" frames with VideoCapture

本文关键字:视频 stuck OpenCV      更新时间:2023-10-16

我使用的是OpenCV 3.1,我试着运行一个简单的代码作为以下一个(主函数):

 cv::VideoCapture cam;
cv::Mat matTestingNumbers;
cam.open(0);
if (!cam.isOpened()) { printf("--(!)Error opening video capturen"); return -1; }
while (cam.read(matTestingNumbers))
{
    cv::imshow("matTestingNumbers", matTestingNumbers);
    cv::waitKey(5000);
}

当我移动相机时,代码似乎没有捕获并显示当前帧,而是显示从前一个位置捕获的所有帧,然后才显示从新位置捕获的帧。

所以当我捕捉到墙时,它会以正确的延迟显示正确的帧(墙本身),但是,当我把相机扭到我的电脑上时,我首先看到大约3帧墙,然后才看到电脑,似乎帧被卡住了。

我尝试使用videoccapture .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;
}

效果如预期

其中一个问题是,您没有调用cv::waitKey(X)来正确冻结窗口X毫秒数。去掉usleep()