当无人机搭载热红外相机完成一次巡检任务后,工程师们往往要面对数百GB的RJPG图像数据。传统的手动处理方式不仅耗时费力,还容易在参数设置环节出现人为误差。本文将分享一套经过实战检验的Python自动化解决方案,帮助您实现从原始图像到温度矩阵的精准转换。
大疆M2EA/M3T等行业无人机生成的热红外图像(RJPG格式)本质上是一种特殊的三通道数据文件。与普通JPEG不同,每个像素点存储的是辐射能量值而非颜色信息。要获取真实的温度数据,需要经过辐射定标、环境参数补偿等专业处理流程。
手动处理这类数据存在三大痛点:
我们开发的自动化脚本基于大疆TSDK 1.4开发,主要实现三个突破:
python复制# 典型处理流程示例
def process_batch(input_dir, output_dir):
for rjpg_file in scan_files(input_dir):
raw_meta = extract_metadata(rjpg_file) # 读取内嵌参数
temp_matrix = calculate_temperature(raw_meta) # 温度计算
save_as_geotiff(temp_matrix, output_dir) # 地理编码输出
推荐使用Miniconda创建隔离的Python环境(3.8+版本),避免依赖冲突:
bash复制conda create -n thermal python=3.8
conda activate thermal
pip install numpy pillow gdal
TSDK核心文件需要手动部署:
dji_thermal_sdk_v1.4_20220929.zip/windows/x64下的dll文件放入系统PATH/include头文件链接到项目目录TSDK的温度转换质量取决于四个环境参数,其影响权重经实测如下:
| 参数 | 单位 | 典型范围 | 误差敏感度 | 调整优先级 |
|---|---|---|---|---|
| 测量距离 | 米 | 1-25 | ★★★★☆ | 1 |
| 相对湿度 | % | 20-100 | ★★☆☆☆ | 3 |
| 发射率 | 0.01 | 0.10-1.00 | ★★★☆☆ | 2 |
| 反射温度 | ℃ | -40.0-500.0 | ★★☆☆☆ | 4 |
参数提取建议工作流:
关键提示:发射率设置对金属表面检测影响显著,建议参考材料发射率表预先配置不同材质模板
我们采用INT16格式的温度输出方案(dirp_measure函数),相比FLOAT32版本可减少50%存储占用,同时保持0.1℃精度:
python复制class ThermalProcessor:
def __init__(self, sdk_path):
self.dll = cdll.LoadLibrary(sdk_path)
def process_image(self, input_path):
# 初始化TSDK句柄
handle = c_void_p()
self.dll.dirp_create_from_rjpeg(input_path, byref(handle))
# 获取图像尺寸
width, height = c_int(), c_int()
self.dll.dirp_get_size(handle, byref(width), byref(height))
# 分配输出缓冲区
temp_array = (c_int16 * (width.value * height.value))()
# 执行温度计算
self.dll.dirp_measure(handle, temp_array)
# 转换为numpy矩阵
return np.ctypeslib.as_array(temp_array).reshape(height.value, width.value)
为应对大规模数据处理需求,脚本采用生产者-消费者模式:
code复制处理流程架构:
1. 主线程扫描输入目录,生成任务队列
2. 工作线程池(默认4线程)并行处理
3. 结果写入线程异步保存TIFF文件
4. 错误日志单独记录不中断流程
异常处理特别注意事项:
转换后的GeoTIFF可直接加载到QGIS/ArcGIS中,建议配色方案:
python复制# 生成温度伪彩色渲染
def apply_colormap(tiff_path):
ds = gdal.Open(tiff_path)
band = ds.GetRasterBand(1)
# 温度分段设置
colors = [
(0, 0, 255), # 低温-蓝色
(0, 255, 0), # 常温-绿色
(255, 255, 0), # 预警-黄色
(255, 0, 0) # 高温-红色
]
# 创建颜色表
ct = gdal.ColorTable()
for i, rgb in enumerate(colors):
ct.SetColorEntry(i, rgb)
band.SetColorTable(ct)
将温度数据与可见光模型融合的Blender处理技巧:
在最近的光伏电站巡检项目中,这套方案将原本需要3天的手动处理压缩到2小时内完成,同时温度测量一致性提升40%。某个深夜的变压器过热预警案例证明,自动化处理的速度优势能为故障抢修赢得宝贵时间。