python系列图像的16位灰度视频



我有一个uint16类型的灰度图像数据集,我想将其保存为视频文件,输出应该是uint16类型的无损视频文件,我尝试了这个代码,

video = cv2.VideoWriter(file_name, 0, fps, (w, h), isColor=False)
for frame in frames:
video.write(frame)
video.release()
cv2.destroyAllWindows()

但opencv仅支持uint8,有人知道做这件事的好方法吗?

您可以使用FFMPEG来完成此操作。FFV1编解码器是无损,并支持灰度16le像素格式(16UC1中的图像(。你可以制作.avi视频。

ffmpeg -i depth_%06d.tif -c:v ffv1 -vf -crf 0 output_ffv1.avi

但是,您的图像必须是gray16le格式(将图像保存为.tif即可(。如果你的图像是PNG格式的,它们可能不是gray16le格式,而是grey形式(如果你以后想从视频中获取图像,这将不起作用(。您可以使用ffprobe进行检查。

ffprobe -i depth_image.png

输出必须具有以下内容:

Stream 0:0: Video: tiff, gray16le, 1280x720, 25 tbr, 25 tbn, 25 tbc

一旦你有了视频(.avi(,你可以用ffprobe再次检查像素格式,它也必须是灰度16le

Stream 0:0: Video: ffv1 (FFV1 / 0x31564646), gray16le, 1280x720, 45067 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc

现在,如果你想从视频中获取图像。你可以使用ffmpeg-python。这从视频中提取第十六单元数组。然后,您可以将此数组保存为PNG或TIFF或任何您需要的格式。

import ffmpeg
def extract_frame(input_vid, frame_num):
out, _ = (
ffmpeg
.input(input_vid)
.filter_('select', 'gte(n,{})'.format(frame_num))
.output('pipe:', format='rawvideo', pix_fmt='gray16le', vframes=1)
.run(capture_stdout=True, capture_stderr=True)
)
return np.frombuffer(out, np.uint16).reshape([720, 1280])

for i in range($totalFrameNumber):
frame = extract_frame('test_ffv1.avi',i)

将$totalFrameNumber更改为.avi视频中的总帧数。

最新更新