![](/img/trans.png)
[英]Read and convert an Heightmap .RAW File (Grayscale 16bit) on Python
[英]python 16bit grayscale video from series of images
我有一个 uint16 类型的灰度图像数据集,我想将其保存为视频文件,output 应该是 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编解码器是无损的,支持gray16le像素格式(16UC1 中的图像)。 您可以制作.avi 视频。
ffmpeg -i depth_%06d.tif -c:v ffv1 -vf -crf 0 output_ffv1.avi
但是,您的图像必须是gray16le格式(将图像保存为 .tif 即可)。 如果您的图像是 PNG,它们可能不是gray16le格式,而是灰色格式(如果您想稍后从视频中获取图像,这将不起作用)。 您可以使用 ffprobe 进行检查。
ffprobe -i depth_image.png
Output 必须有类似的东西:
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 arrays。 然后您可以将此数组保存为 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 更改为 your.avi 视频中的总帧数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.