2017-07-24 447 views
2

我目前有一个捕获AVI文件的GUI。其工作原理如下:如何使用Matlab实时保存avi和时间戳?

controller

控制器中的图像从相机预览。当我按下“开始记录”按钮时,程序会用getsnapshot()函数和writeVideo()函数捕捉图像,以将图像写入视频文件。

我在getsnapshot()函数之后获得带时钟功能的时间信息。 (我发现使用[frame,metadata] = getsnapshot(obj)时,元数据是空的,我不知道为什么)。

我想问我是否可以实时将时间信息保存到视频文件(例如avi文件)。我不知道怎么做。任何人有想法?

+0

您的评论以下有点令人困惑,您是否无法获取每帧的时间数据?你想在图像上显示时间戳吗?或者您是否想在不修改图像帧的情况下将时间数据添加到电影文件? – gnovice

+0

嗨,gnovice。非常感谢您的持续帮助。我可以在不修改图像帧的情况下将时间数据添加到电影文件中吗?我不知道怎么做。而且我也对视频的时间信息感到困惑。我发现使用getdata()时,帧的时间间隔分布很好,可能是相机的采样率。但是当使用getsapshot()时,时间并不是那么分散的(可能是因为我在getsapshot之后调用了其他函数,程序像这样while(true)im = getsapshot(); timestamp = clock;其他函数; VideoWriter ); ...)。 – Lee

回答

0

我不知道有任何方法将自定义标题字段添加到AVI文件来存储您的附加时间信息。但是,您可能会添加一个额外的行到您的图像帧的底部,其中包含该帧的编码时间戳信息。这将取决于你的frame数据的格式,但这里有一个例子来说明:

假设frame是典型的RGB (Truecolor) image,有三个彩色平面和uint8数据值,比如内置的样本图像'peppers.png'

img = imread('peppers.png'); 

enter image description here

clock函数返回当前数据和时间作为日期矢量,这是一种六元件double-precision矢量。这需要48个字节的存储空间。我们可以使用typecast函数将1×6的double向量转换为1x48的uint8向量,然后将其添加到红色图像平面的其他行的开始处(填充行和其他平面的其余部分与自动零):

img(end+1, 1:48, 1) = typecast(clock, 'uint8'); 

额外的排在底部是相当不起眼:

enter image description here

我们可以重建的时间戳和原始图像,像这样:

t = typecast(img(end, 1:48, 1), 'double'); 
img = img(1:(end-1), :, :); 
+0

嗨。 gnovice。非常感谢您的帮助。实际上,我添加了时间戳,但我将数据转换为图像。如下图所示。 – Lee

+0

我可以使用getdata()实时录制视频吗?但是当我录制时,我发现getdata()真的很慢。每秒只能获得2帧...并且我发现getsnapshot()在记录过程中会丢失一些帧(没有太多,没关系)。 – Lee

+0

嗨,gnovice。非常感谢您的持续帮助。我可以在不修改图像帧的情况下将时间数据添加到电影文件中吗?我不知道怎么做。而且我也对视频的时间信息感到困惑。我发现使用getdata()时,帧的时间间隔分布很好,可能是相机的采样率。但是当使用getsapshot()时,时间并不是那么分散的(可能是因为我在getsapshot之后调用了其他函数,程序像这样while(true)im = getsapshot(); timestamp = clock;其他函数; VideoWriter ); ...)。 – Lee