Optris PI 400/450热像仪RAVI文件批量转CSV温度数据咨询
Optris PI 400/450 RAVI文件温度提取及CSV导出解决方案
你之前采用转yuv420p的方案失效,核心原因是yuv420p为8位有损编码,会丢失RAVI文件中存储的16位原始温度计量信息,无法还原真实温度值。以下是可落地的实现方案:
前置准备
- 安装Optris官方提供的
libirimager解码库,该库为官方适配工具,可直接读取RAVI文件中的原始温度数据,无需额外转码 - 可根据需求安装库的Python绑定,方便后续批量处理
具体实现步骤
步骤1:批量提取RAVI中的原始温度帧
调用libirimager自带的ir_raw_player命令行工具,直接从RAVI文件按每秒1帧的频率导出16位原始温度帧,命令示例:ir_raw_player -i 输入文件路径.ravi -o 帧输出目录/ -f 1
其中-f 1参数代表每秒导出1帧,输出的.raw文件为无压缩16位灰度数据,每个像素对应原始温度计量值,无精度损失。
你可以编写Shell或Python脚本遍历1260个RAVI文件,自动完成帧提取工作。
步骤2:原始值转换为实际温度值
根据官方校准规则,原始16位像素值转换为摄氏度温度值的公式为:
温度值 = (原始16位无符号整数 / 10) - 100
如果你的设备有自定义校准参数,可对应调整公式中的系数。
步骤3:批量导出CSV文件
以下为Python实现的批量转换代码:
import numpy as np import os import csv # 固定参数 FRAME_WIDTH = 382 FRAME_HEIGHT = 288 RAW_FRAME_ROOT = "./ravi_frames/" CSV_OUTPUT_ROOT = "./temperature_csv/" os.makedirs(CSV_OUTPUT_ROOT, exist_ok=True) # 遍历所有原始帧文件 for root, dirs, files in os.walk(RAW_FRAME_ROOT): for file in files: if not file.endswith(".raw"): continue # 读取16位原始数据 raw_path = os.path.join(root, file) raw_data = np.fromfile(raw_path, dtype=np.uint16) # 还原为二维帧数据 frame = raw_data.reshape(FRAME_HEIGHT, FRAME_WIDTH) # 转换为温度值 temp_frame = (frame / 10) - 100 # 导出CSV csv_name = os.path.splitext(file)[0] + ".csv" csv_path = os.path.join(CSV_OUTPUT_ROOT, csv_name) with open(csv_path, "w", newline="") as f: writer = csv.writer(f) writer.writerows(temp_frame.tolist())
步骤4:(可选)导出可视化热图
如果需要同步生成每帧的热图文件,可在上述代码的温度转换步骤后添加以下逻辑:
import cv2 # 温度值归一化后映射为伪彩图 norm_temp = cv2.normalize(temp_frame, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U) color_heatmap = cv2.applyColorMap(norm_temp, cv2.COLORMAP_INFERNO) # 保存图像 img_name = os.path.splitext(file)[0] + ".png" cv2.imwrite(os.path.join("./heatmap_output/", img_name), color_heatmap)
性能优化建议
- 批量处理时按RAVI文件分组创建输出目录,避免单目录下文件过多导致IO性能下降
- 可采用多进程并行处理不同RAVI文件,缩短总处理时长
- 全程避免对RAVI文件进行任何有损转码操作,所有处理基于原始16位数据执行,防止温度值失真
内容的提问来源于stack exchange,提问作者Paul Bekaert
相关产品推荐
相关产品推荐

