imwrite opencv 会影响捕获时间吗?

is capture time affected with imwrite opencv?

我正在使用 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 值。这怎么可能?提前致谢。

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

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

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