c++ - 带有 VideoCapture 的 OpenCV "stuck"帧

标签 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(以及根据此更改的主要函数的其余部分)但是没有任何帮助,我仍然有“卡住”的框架。

顺便说一句,这些是我在网上找到的解决方案。

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

谢谢你,丹。

编辑:

我尝试按如下方式检索帧:

#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()!

关于c++ - 带有 VideoCapture 的 OpenCV "stuck"帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38856864/

相关文章:

OpenCV 2.4.3 VideoCapture 不工作

ios - AVFoundation:将文本添加到 CMSampleBufferRef 视频帧

opencv - OpenCV 中的 GStreamer API : autovideosink vs appsink

C++:基本数组交换

c++ - 在 C++ 中将未命名的临时变量括起来

c++ - 我的应用程序在使用 Do/While 循环解析表时崩溃

c++ - 我如何在 Lua 中使用 Win32 迭代器?

c++ - OpenCV - cudaimgproc 错误

opencv - 通过Opencv findContours函数检测到的轮廓中发现了太多点

python - 将黑白图像转换为数字数组?