使用imwrite opencv影响捕获时间?

时间:2018-05-18 14:03:55

标签: c++ image opencv capture timing

我正在使用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 ms!如果我在图像写入后将第二个调用放到gettimeofday(),我将获得相同的15~17ms的值。怎么可能?提前谢谢。

1 个答案:

答案 0 :(得分:2)

这是因为您只测量等待VideoCapture的时间。

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

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