OpenCV使用VideoCapture“卡住”帧

时间:2016-08-09 17:17:08

标签: c++ opencv video-capture

我正在使用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(以及根据此更改的其余主要功能)但没有任何帮助,我仍然有“卡住”帧。

BTW,这些是我在网上找到的解决方案。

我该怎么做才能解决这个问题?

谢谢Dan。

修改

我尝试按以下方式检索框架:

#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;
}

它按预期工作。

1 个答案:

答案 0 :(得分:0)

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