python - 来自一系列图像的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编解码器是无损的,支持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
输出必须具有以下内容:
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 视频中的总帧数。
推荐阅读
- c - 将未知长度的字符串与已知长度的字符串进行比较
- python - 如何在同一个 Docker 中使用 mysql 运行 django web 应用程序?错误(docker-compose up -d 似乎工作正常)
- python - 调度方法时缺少参数 self
- arrays - 数组查找给出错误“属性 'id' 不存在类型'未知'”在 Angular 中执行 firebase 连接(错误 TS2339)
- jestjs - Puppeteer:每次访问页面时存储和访问上下文或元数据
- c++ - 在 C++ 中使用内联方法时出现未定义符号错误
- javascript - Javascript - 创建一个返回参数列表的柯里化函数
- apache - 涉及 RewriteMap 小写的 Apache htaccess 规则 - 转换为 Nginx 规则
- javascript - multer处理的视频没有声音
- javascript - Yargs : 在失败函数中访问已处理的 argv