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
的时间。
在第一个示例中,提取下一帧将始终阻塞,直到它准备就绪(并且只在那里花费时间),这意味着您将看到与帧速率成反比的值。
在第二个示例中,第一帧的读取时间应该相同。但是,您需要花时间将图像写入文件。发生这种情况时,相机将开始记录下一帧 - 这意味着当您下次要求它给您一张图像时,这样做所需的部分时间已经过去,因此您的等待时间更短。
我正在使用 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
的时间。
在第一个示例中,提取下一帧将始终阻塞,直到它准备就绪(并且只在那里花费时间),这意味着您将看到与帧速率成反比的值。
在第二个示例中,第一帧的读取时间应该相同。但是,您需要花时间将图像写入文件。发生这种情况时,相机将开始记录下一帧 - 这意味着当您下次要求它给您一张图像时,这样做所需的部分时间已经过去,因此您的等待时间更短。