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

2024-10-05 11:06:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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, 有人知道做这件事的好方法吗


Tags: 数据代码name图像类型videocv2frame
1条回答
网友
1楼 · 发布于 2024-10-05 11:06:43

你可以用FFMPEG来做。FFV1编解码器是无损的,支持灰度16LE像素格式(16UC1格式的图像)。你可以制作一个.avi视频

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

但是,您的图像必须采用灰度16LE格式(将图像另存为.tif即可)。如果您的图像是PNG格式,则它们可能不会采用gray16le格式,而是采用gray格式(如果您希望稍后从视频中获取图像,则此方法不起作用)。您可以使用ffprobe进行检查

ffprobe -i depth_image.png

输出必须具有以下内容:

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

获得视频(.avi)后,可以使用ffprobe再次检查像素格式,它也必须是gray16le

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

现在,如果你想从视频中获取图像。您可以使用ffmpeg-python。这将从视频中提取unit16阵列。然后,您可以将此阵列保存为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视频中的总帧数

相关问题 更多 >

    热门问题