【问题标题】:Delay in capturing camera frames using openCV使用openCV捕获相机帧的延迟
【发布时间】:2019-12-09 07:55:54
【问题描述】:

我正在编写一个程序来使用 opencv 2.49 捕获相机帧。

我的问题是相机盖可以捕捉到 500 FPS。但是在第 5 帧捕获后,帧数会下降到 40 FPS,有时会降到 500 FPS。

有人知道为什么会这样吗?如何修复 500 FPS 的捕获帧。

I have attached the output FPS

while(true)
{
    cout << "\nStart while loop:" << endl;
    auto t1 = chrono::high_resolution_clock::now(); 


    Mat curFrame;
    cap >> curFrame;
    if( curFrame.empty() ) break; // end of video stream

    auto t2 = chrono::high_resolution_clock::now();     

    auto cap_time = chrono::duration_cast<chrono::microseconds>( t2 - t1 ).count();
    cout << "cap_time :" << cap_time << " microseconds, " << 1000000/(float)cap_time << " FPS" << endl;

    imshow("Original", curFrame);

    if (waitKey(1) >= 27) 
    {
        cout << "esc key is pressed by user" << endl;
        break;
    }   
}

【问题讨论】:

  • 不,我正在使用 Linux 构建在 Xilinx Zedboard 上运行的应用程序。代码与-O2结合使用。
  • 即使是 640x480 RGB 图像也只有大约 1 MB。所以 500 fps 几乎会使最快的 USB3 连接饱和,并且需要 5 倍于千兆以太网的带宽……相对而言,很少有相机超过 30 fps,甚至更少 60 fps。

标签: c++ linux opencv video-capture


【解决方案1】:

您必须测量与拍摄最后一张图像的时间之间的差异,而不是测量将图像保存到变量中所需的时间。

伪代码:

time = -1;
while (true)
{
    new_time = now();
    if (time != -1)
    {
        time_diff = new_time - time;
        if (time_diff == 0) // avoid null pointer exception
            cout << "infinite FPS";
        else
            cout << 1000000.d / double(time_diff) << "FPS";
    }
    time = new_time;
    ...
}

另一个改进是:

  1. 每秒打印 FPS,而不是每次拍照。
  2. 使用时钟的周期属性而不是 1000000。
  3. 我认为您想要“== 27”而不是 ">= 27"

【讨论】:

  • 你能告诉我如何测量它吗?
猜你喜欢
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 2018-01-04
相关资源
最近更新 更多