【问题标题】:OpenCV "stuck" frames with VideoCapture使用 VideoCapture 的 OpenCV“卡住”帧
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 在多次尝试修复此代码后,我忘记了我已经这样做了。但它没有帮助。还是谢谢你。
  • 你试过OpenCV sample吗?
  • @Danaro 另外,众所周知,USB 摄像头和驱动程序存在问题。您是否尝试过执行非 OpenCV 应用程序以确保相机按预期工作?
  • 我测试了我的相机,它似乎工作得很好,然后运行 ​​OpenCV 示例并没有显示任何更好的结果,我延迟了 5 秒,然后我将相机转到了房间的一侧,我看到了正确的墙,然后延迟我把它转到另一边,当延迟结束时,我看到的是第一面而不是新的。
  • @Danaro 在这种情况下,我建议您分享用于测试的应用程序的完整源代码。
猜你喜欢
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多