2024-10-05 11:06:43 发布
网友
我有一个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
但是,您的图像必须采用灰度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视频中的总帧数
你可以用FFMPEG来做。FFV1编解码器是无损的,支持灰度16LE像素格式(16UC1格式的图像)。你可以制作一个.avi视频
但是,您的图像必须采用灰度16LE格式(将图像另存为.tif即可)。如果您的图像是PNG格式,则它们可能不会采用gray16le格式,而是采用gray格式(如果您希望稍后从视频中获取图像,则此方法不起作用)。您可以使用ffprobe进行检查
输出必须具有以下内容:
获得视频(.avi)后,可以使用ffprobe再次检查像素格式,它也必须是gray16le
现在,如果你想从视频中获取图像。您可以使用ffmpeg-python。这将从视频中提取unit16阵列。然后,您可以将此阵列保存为PNG或TIFF或任何您需要的格式
将$totalFrameNumber更改为.avi视频中的总帧数
相关问题 更多 >
编程相关推荐