如何用GStreamer保存ZED 2相机的原始深度图视频?
保存ZED 2相机GRAY16_LE格式真实深度值的方法
问题描述
我使用ZED 2相机,它输出GRAY16_LE格式的未归一化真实深度图数值,希望保存这些数值以用于后续处理和归一化,且不丢失真实深度信息。
此前仅做可视化的GStreamer管道:
gst-launch-1.0 zedsrc stream-type=3 ! 'video/x-raw,format=GRAY16_LE' ! autovideoconvert ! queue ! fpsdisplaysink
尝试过将图像转换为RGB并压缩保存为.avi格式,但像素数值丢失了原本的深度含义,既不是真实深度值也不像归一化后的结果:
gst-launch-1.0 zedsrc stream-type=3 ! 'video/x-raw,format=GRAY16_LE' ! videoconvert ! video/x-raw,format=RGB ! jpegenc ! avimux ! filesink location=video.avi
请问有没有方法可以保存相机输出的真实深度值?应该使用什么格式?
解决方案
要保存原始的GRAY16_LE深度数据且不丢失信息,关键是别做有损压缩和不必要的格式转换,直接存原始的16位灰度数据就行,以下是几种可行的方法:
1. 用无损视频容器保存(推荐)
用MKV或者无压缩AVI这类容器直接封装原始的GRAY16_LE数据流,不会修改深度数值:
# 保存为MKV格式(完美支持16位原始数据) gst-launch-1.0 zedsrc stream-type=3 ! 'video/x-raw,format=GRAY16_LE,width=1280,height=720' ! matroskamux ! filesink location=raw_depth.mkv # 保存为无压缩AVI格式 gst-launch-1.0 zedsrc stream-type=3 ! 'video/x-raw,format=GRAY16_LE' ! avimux ! filesink location=raw_depth.avi
这类容器存的就是相机输出的原始16位深度值(ZED的这个格式单位一般是毫米,你可以查下相机参数确认),后续用OpenCV或者GStreamer就能直接读出来用。
2. 逐帧存成无损图像格式
如果需要单帧处理,就把每帧存成PNG或者TIFF,这俩格式都能无损存16位灰度数据:
# 保存为PNG序列(文件名自动按顺序编号) gst-launch-1.0 zedsrc stream-type=3 ! 'video/x-raw,format=GRAY16_LE' ! pngenc ! multifilesink location=depth_frame_%04d.png # 保存为TIFF序列 gst-launch-1.0 zedsrc stream-type=3 ! 'video/x-raw,format=GRAY16_LE' ! tiffenc ! multifilesink location=depth_frame_%04d.tif
之后读取这些图像文件时,直接读16位灰度通道就能拿到原始深度数值。
3. 避坑提醒
- 绝对别用JPEG、H.264这类有损压缩格式,它们会把16位数据的精度毁掉,原始深度值就没了。
- 后续用代码读取的时候,一定要指定格式为
GRAY16_LE(小端模式的16位灰度),不然数值会解析错。
内容的提问来源于stack exchange,提问作者jessicalfr
相关产品推荐
相关产品推荐

