【问题标题】:is capture time affected with imwrite opencv?imwrite opencv 会影响捕获时间吗?
【发布时间】:2018-05-18 14:03:55
【问题描述】:

我正在使用 C++ 和 opencv 来捕捉相机图像。在我的代码中如下所示的这个过程中,我还在捕获图像之前和之后使用gettimeofday() 测量捕获持续时间(以毫秒为单位)。

Mat IMG; 
unsigned long ms;
VideoCapture cap(0);
struct timeval tp1,tp2;
while(1)
{
   gettimeofday(&tp1,NULL);
   cap>>IMG;
   gettimeofday(&tp2,NULL);
   ms=10000000*(tp1.tv_sec-tp2.tv_sec)+(tp1.tv_usec-tp2.tv_usec);
   cout<<ms/1000<<endl;
}

我知道我的相机每秒最多可以拍摄 60 帧。因此,此代码将输出 15~17 ms 的值。现在我想保存我的图像,因此我使用imwrite() 函数并在我第二次调用gettimeofday() 后添加它,如下所示:

Mat IMG; 
unsigned long ms;
VideoCapture cap(0);
int cc=0;
struct timeval tp1,tp2;
while(1)
{
   gettimeofday(&tp1,NULL);
   cap>>IMG;
   gettimeofday(&tp2,NULL);
   ms=10000000*(tp1.tv_sec-tp2.tv_sec)+(tp1.tv_usec-tp2.tv_usec);
   cc=cc+1;
   imwrite("IMG_"+std::to_string(cc)+".png",IMG);
   cout<<ms/1000<<endl;
}

现在在这种情况下,输出将是 5~6 毫秒!如果我在图像写入后第二次调用gettimeofday(),我将得到相同的 15~17ms 值。这怎么可能?提前致谢。

【问题讨论】:

    标签: c++ image opencv capture timing


    【解决方案1】:

    发生这种情况是因为您只测量了在 VideoCapture 上的等待时间。

    在第一个示例中,提取下一帧将始终阻塞,直到它准备好(并且只在那里花费时间),这意味着您将看到与帧速率相反的值。

    在第二个示例中,第一帧的读取时间应该相同。但是,您会花时间将图像写入文件。发生这种情况时,相机将开始记录下一帧 - 这意味着当您下一次要求它为您提供图像时,执行此操作所需的部分时间已经过去,因此您的等待时间更短。

    【讨论】:

    • 这就是重点!所以从相机本身读取的帧不是顺序的,在写入另一帧时,相机开始捕捉另一帧,而我还没有达到 cap>>IMG 的点?
    • 是的! VideoCapture 可能会在内部缓冲帧,并且只有在没有准备好帧时才会阻塞
    猜你喜欢
    • 2010-12-18
    • 2011-11-11
    • 2021-09-25
    • 2018-01-31
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2021-03-20
    • 2021-02-18
    相关资源
    最近更新 更多