求助:使用FFmpeg将红外相机uint16格式Raw数据转.h264/MP4遇异常
解决uint16红外原始数据转H.264/MP4的显示异常问题
你已经找对了输入参数的核心方向(小端字节序、分辨率调整+旋转),但问题的关键在于16位灰度数据到8位YUV格式的动态范围映射——ImageJ会自动帮你拉伸红外数据的有效区间到可见范围,但FFmpeg默认不会做这个处理,直接转换会导致图像细节丢失或显示异常。
修正后的命令(匹配ImageJ显示效果)
先确认你的ImageJ设置:如果输入分辨率是140x110、小端字节序,使用这条命令:
ffmpeg -f rawvideo -pix_fmt gray16le -s:v 140x110 -r 30 -i binaryMarianData.bin \ -vf "transpose=clock, scale=in_range=full:out_range=tv, format=yuv420p" \ -c:v libx264 -crf 23 output.mp4
如果你的ImageJ里分辨率是110x140(无需旋转),去掉transpose=clock即可:
ffmpeg -f rawvideo -pix_fmt gray16le -s:v 110x140 -r 30 -i binaryMarianData.bin \ -vf "scale=in_range=full:out_range=tv, format=yuv420p" \ -c:v libx264 -crf 23 output.mp4
关键参数解释
scale=in_range=full:out_range=tv:把16位全范围(0-65535)的红外数据,映射到H.264常用的8位TV范围(16-235),这是让图像亮度、对比度和ImageJ显示一致的核心。如果想要映射到0-255的全范围,改成scale=in_range=full:out_range=full即可。transpose=clock:旋转图像到正确方向,和你在ImageJ里的显示匹配。-crf 23:控制H.264的质量,23是默认值,数值越小质量越高(18-28是常用区间)。
进阶:自动优化红外图像对比度
如果红外数据的有效动态范围不是完整的0-65535,可以用直方图均衡化滤镜自动拉伸:
ffmpeg -f rawvideo -pix_fmt gray16le -s:v 140x110 -r 30 -i binaryMarianData.bin \ -vf "transpose=clock, histogram_equalization=nbins=65536, format=yuv420p" \ -c:v libx264 -crf 23 output.mp4
这个命令会自动分析16位数据的直方图,把最暗到最亮的区间拉伸到8位的可见范围,适合红外这种可能存在局部过曝/过暗的场景。
内容的提问来源于stack exchange,提问作者Lukas Marschall
相关产品推荐
相关产品推荐

