
1. 项目概述与整体思路拆解做无人机热红外巡检这些年我接触最多的一条链路就是用 DJI TSDK 解析 RJPG 热红外数据再靠 Pix4D 拼出温度地图。这句话看似简单实际操作里却坑很多。RJPG 不是普通 JPG直接拖进看图软件只能看到调色板预览拿不到真温度而 Pix4D 的“热红外拼接”也远不是把照片堆在一起生成镶嵌图它需要你理解辐射定标、重叠率、参数优化和温标输出。这篇内容适合三类人第一类是刚接触 DJI H20T、M3T、X5 这类热红外机载设备想搞懂 RJPG 到底是什么的技术人员第二类是做农业、光伏、建筑外墙、电力巡检项目想把航拍热红外数据变成客户能看的温度图、报告和 GIS 图层的从业者第三类是自己写 Python / iOS / Android 脚本想用 TSDK 二次开发但对温度像素换算还有疑问的开发者。你会看到一条完整的链路RJPG 元数据怎么读、TSDK 怎么拿逐点温度、温度矩阵怎么变成 GeoTIFF、Pix4D 怎么拼接、最后在 QGIS 里怎么渲染成一张有讲究的温度地图。1.1 核心需求解析从数据到决策先说痛点。大疆热红外相机拍出来的 RJPG从文件后缀看是 JPEG但它比普通 JPG 多了一大块内容辐射定标信息。普通 JPG 打开是一张“看起来像热像图”的 RGB 图色带能看出热点但鼠标点上去你不知道那里是 41.3°C 还是 45.8°C。你要拿温度做判断比如光伏组件是不是热斑、配电柜接头是否过温、建筑外立面有没有空鼓就必须把“图像像素”换算成“温度值”。换算完还只是单张照片。无人机一条航线飞下来几百张 RJPG 需要拼成一张完整的温度正射图否则外业报告怎么出客户总不能看一百张照片自己脑补。于是“TSDK 解析温度 Pix4D 拼接成图”就成了一条很自然的技术路线TSDK 解决单张温度精度问题Pix4D 解决空间位置和整体成图问题。1.2 为什么是 TSDK Pix4D 而不是其它方案我见过有人直接用 Python 读 RJPG 的 JPEG 数据把每个像素的灰度值线性拉伸做拼接最后也产出了一张“假热力图”。这种图的颜色分布差不多但像素值和真实温度对不上最多算一张可视化示意图不能用来做设备诊断。原因很简单RJPG 的可见像素经过了解码、裁剪、调色板映射已经不是温度物理量本身。TSDK 的价值在于它能把相机传感器层面的温度数据读出来或者至少给出官方校准后的逐点温度这样我们拿到的就是“可计算”的数据。Pix4D 的价值在于它不只能做普通 RGB 拼图还知道热红外影像的投影、畸变和温度指数输出。两者组合既保证了温度真实性也保证了结果的空间准确性。如果只用纯粹的计算机视觉库自己拼畸变校正、GPS/姿态融合、温度指数生成这些环节要折腾很久而且很难收敛到可靠结果。还有一个原因是工程效率。用 TSDK 做解析后剩下的数百张影像处理、像控点导入、正射校正、温度指数导出Pix4D 都有成熟流程项目交付时还能直接导出 Google Tile、GeoTIFF、报告省掉大量重复开发时间。1.3 整体流程概览一条完整的温度地图生产链路我一般分成四步采集用带热红外载荷的无人机按规范航线拍 RJPG保证重叠率和姿态信息完整。解析用 TSDK 或配套工具读取每张影像的辐射定标参数得到逐点温度矩阵。转换把温度矩阵保存为带地理坐标的浮点 GeoTIFF或者保留 RJPG 交给 Pix4D 做辐射定标识别。拼接在 Pix4D 中建立工程设置热红外处理参数生成温度正射影像。后处理在 QGIS / ArcGIS 中做色带渲染、阈值分级、导出正交报表。后面所有内容都是围绕这套流程里最容易出错的细节展开。2. RJPG 与 TSDK 解析把照片变成温度数据的核心细节2.1 RJPG 不是普通 JPG而是一个数据容器RJPG 全称 Radiometric JPEG翻译过来是“辐射定标 JPEG”。你可以把它理解成一个集装箱里面至少装着两层东西一层是给人看的 8 位预览图另一层是给软件算的温度数据和辐射定标元数据。预览图经过调色板映射已经丢失了原始辐射精度但嵌入的元数据和原始传感器数据还在TSDK 或专业软件就是靠这些东西还原温度。大疆的 RJPG 文件里通常会携带这几类信息拍摄时的发射率设置、反射温度、大气温度、相对湿度、目标距离还有 GPS 坐标、云台姿态、相机内参、采集时间。这些信息分散在 EXIF、XMP 或厂商自定义段里各路解析工具读出来的字段名不完全一致这是很多新手第一次接触时最容易懵的地方。如果你也想验证一下自己手上的 RJPG 到底有什么最直接的办法是用 ExifTool 看字段。Windows/macOS/Linux 都能装读取命令如下exiftool -a -G1 -s DJI_0001.RJPG输出会特别长建议先 grep 一下关键词exiftool -a -G1 -s DJI_0001.RJPG | grep -i -E therm|temp|emiss|humi|reflect你会看到类似这样的字段Emissivity发射率通常 0.1~1.0不同材料不一样。Reflected Temperature反射温度对低发射率目标影响很大。Atmospheric Temperature/Relative Humidity大气温度和相对湿度。Distance / Focus Distance目标大致距离影响大气透射率计算。IR Window Temperature或类似字段有些相机还会记录内部窗口温度。不同型号、不同固件版本字段名可能不同。我的建议是拿到一批 RJPG 后不要急着批量处理先抽两三张跑一遍 ExifTool看看字段到底叫什么再写脚本。省得后面解析全乱套。2.2 TSDK 读取逐点温度的正确姿势大疆 TSDK 提供热红外相机控制能力各家机型能力略有差异。以移动端开发为例你可以在 TSDK 的热像相机回调里注册监听获取当前画面的热像素数据。用伪代码来表达大概是这样// 示意代码方法名以你使用的 TSDK 版本为准 ThermalCamera thermalCamera aircraft.getCamera().getThermalCamera(); thermalCamera.setThermalDataListener(new ThermalCamera.ThermalDataListener() { Override public void onThermalData(ThermalData thermalData) { // 获取某个像素点的温度值单位通常为摄氏度 double t thermalData.getPointTemperature(x, y); // 或者直接拿整帧温度矩阵 ThermalData.ThermalImage thermalImage thermalData.getThermalImage(); // thermalImage 里的像素需要按官方接口转成 float 温度图 } });实际操作里我更推荐在机载端或移动端直接把整帧温度矩阵取出来保存成 NumPy 的.npy文件或 CSV然后回到 PC 端继续处理。因为在一个实时回调里逐点查询温度效率非常低几百帧数据每一帧 640×512 分辨率逐点查询会产生几十万次函数调用性能扛不住。如果你不想写 TSDK 代码也可以先用 DJI Thermal Analyzer 这类官方或第三方工具验证单张 RJPG 的温度是否正常确认温度和现场用接触式测温计量的结果一致再考虑批量跑。2.3 从温度矩阵到标准 GeoTIFF拿到温度矩阵之后下一步是把它和空间位置绑定。Pix4D 拼接需要识别影像方位而 GeoTIFF 的好处是直接把每个像素和地理坐标对应起来。假设你已经用 TSDK 导出了一张temperature.npy里面是 float32 的摄氏度温度矩阵同时你从 EXIF/GPS 日志里拿到了影像中心和四角的地理信息下面这段 Python 脚本可以把它写成带坐标的 GeoTIFFimport numpy as np import rasterio from rasterio.transform import from_origin from rasterio.crs import CRS temp_map np.load(temperature.npy) # shape: (height, width) # 假设影像覆盖范围和中心点坐标如下单位米/度 # 实际项目中可以从 DJI 拍摄日志、RTK 文件、EXIF 中读取 center_lon 116.3912 center_lat 39.9072 pixel_width 0.01 # 每个像素代表的地面尺寸正射拼接后计算得到 pixel_height 0.01 height, width temp_map.shape left center_lon - (width * pixel_width) / 2 top center_lat (height * pixel_height) / 2 transform from_origin(left, top, pixel_width, pixel_height) out_path temperature_geotiff.tif with rasterio.open( out_path, w, driverGTiff, heightheight, widthwidth, count1, dtypenp.float32, crsCRS.from_epsg(4326), transformtransform, ) as dst: dst.write(temp_map.astype(np.float32), 1)这段代码里最容易错的是transform的方向和单位。如果无人机用的是 UTM 坐标系你要先把经纬度转成 UTM再用米为单位写 GTiff如果用 EPSG:4326经纬度和像素宽度的单位是“度”很多情况会导致 GeoTIFF 看起来长宽比不对。我的建议是所有中间产物统一用 UTM 投影最后再根据项目要求重投影到 Web Mercator 或 CGCS2000。还有一点要留意温度矩阵是用摄氏度写入还是用开尔文写入。我习惯用摄氏度单位写进 GeoTIFF 的元数据里避免后续看图的人把 20 当成 20K 还是 20°C。在问题排查时单位不统一最容易造成“数据看起来没错实际全错”的情况。2.4 批量 RJPG 处理的关键考量一个完整项目通常有几百到上千张 RJPG靠手工一张张转 GeoTIFF 不现实。批量处理时我建议写一个 pipeline分三步用 ExifTool 导出所有影像的元数据 JSON汇总 GPS、姿态、时间、定标参数。用 TSDK 批量导出每张影像的温度矩阵保存为.npy或.tif。把第 1 步的元数据和第 2 步的温度矩阵合并输出带地理参考的 GeoTIFF。其中第 2 步最耗时。热红外图分辨率本身不高但逐张调用 SDK 接口IO 和内存会积累。建议用多线程/多进程分批处理每处理一张就释放内存不要一次性把几百张 640×512×4 字节的 float32 矩阵全部堆到内存里。另外处理前一定要检查文件时间戳和 GPS 时间同步。热红外相机和可见光相机的采集频率不同如果飞行平台把两类影像混在一起拼接时会出现时间错位导致温度位置偏移。做精准项目时我甚至会单独架设一台记录温度的 SDK 主机通过 PTP 或 NTP 与飞控时间对齐。3. Pix4D 拼接实战从导入 RJPG 到输出温度地图3.1 采集阶段就要为拼接做好准备很多人等到 Pix4D 拼接失败才意识到数据采集有问题。热红外影像和普通航拍影像不一样它的分辨率低、纹理信息少、温度对比度可能很差如果航线规划和拍摄参数没做好软件再强也救不回来。先说重叠率。普通正射影像航向重叠率 70%~80% 就够了热红外影像我建议航向重叠率 80% 以上旁向重叠率 70% 以上。原因很简单温度特征经常是“大片渐变”没有明显的角点匹配算法容易找错位置重叠率越高匹配冗余越多成功率越高。如果是屋顶、光伏板这种弱纹理场景甚至可以到 85% 以上。再说飞行高度。热红外镜头的视场角通常比可见光小同样高度下覆盖面积也更小。确定航高的核心指标是地面采样距离 GSD热红外巡检一般按目标尺寸反推比如巡检单个光伏组件要求 GSD 小于 2~3 cm如果是大面积山体找热泉GSD 可以放宽到 10 cm 以上。最后是环境控制。热红外对温度场极其敏感太阳照射角度一变同一个屋顶的温度就能差好几度。我一般建议在阴天或日出前、日落后采集这样太阳辐射影响小温度和发射率更均匀拼接出来的图也更稳定。如果必须白天飞尽量选在正午前后固定时段保证整个任务期太阳角度变化不大。3.2 Pix4D 项目创建与 RJPG 导入Pix4Dmapper 支持直接导入 DJI 的 RJPG 文件。新建工程时把文件夹里所有.RJPG拖进去软件会读取 EXIF/GPS 信息在地图上排列照片。这里有一个很关键的判断你的 Pix4D 版本是否识别为热红外工程。版本合适的话你会看到相机列表里出现热红外相机型号或者在处理选项中看到 Thermal / Radiometric 相关选项。如果 Pix4D 只是把 RJPG 当成普通 JPEG没有任何温度相关选项说明它没能识别元数据。这种情况先升级 Pix4D 版本或者去官网确认是否支持你的大疆相机型号。如果还不行就只能在第二步用 TSDK 先转 GeoTIFF再把 GeoTIFF 导入 Pix4D但这样会丢掉一部分辐射标定自动识别能力需要谨慎验证温度绝对值。导入后先别急着处理。打开地图视图检查照片位置有没有明显漂移、有没有方向颠倒、有没有缺图。我遇到过明明飞了 300 张导入后只有 200 张有 GPS 记录的情况如果直接处理拼接结果肯定豁口一堆。先看数据再做处理这是基本习惯。3.3 处理选项和温度指数输出设置Pix4D 的处理流程分初始化、点云、正射三个阶段。对于温度地图项目我不建议浪费时间做完整点云构建和 DSM重点放在“初始化处理”和“正射影像与指数图”两步。在Processing Options - Maps里找到温度指数选项。如果你的工程被正确识别为热红外Index Calculator 里一般会出现温度相关指数常见的有Mean Temperature、Max Temperature、Min Temperature。勾选你需要输出的指数勾选 Export GeoTIFF这样处理完就能得到一张每个像素都带温度值的正射温度图。参数设置方面我常用这一组参数项建议值原因Keypoints Image ScaleFull热红外图分辨率低全分辨率提取特征点更可靠Matching WindowAerial Grid or Corridor无人机航拍场景匹配更稳定Internal Parameters OptimizationAdjustRJPG的EXIF内参不一定准优化后能减少畸变误差Point Cloud Densification不必须只做温度图不需要密点云DSM GenerationOff避免把大量时间花在不需要的数字表面模型上处理完成后先在 Pix4D 里预览温度指数图再导出 GeoTIFF。如果多个指数分别生成了多个 GeoTIFF后续可以在 GIS 软件里统一管理。3.4 在 QGIS 里把温度图渲染成“看得懂”的成品Pix4D 导出的温度 GeoTIFF 通常是一个单波段浮点栅格直接打开是灰白一片不渲染没法看。我习惯在 QGIS 里用 Singleband pseudocolor 样式把温度映射成从深蓝到深红的渐变。关键技巧是设置合适的显示范围。比如光伏巡检我常用的范围是 15°C~65°C中间值 35°C 左右作为警戒线电力设备检测可能在 10°C~120°C。范围设得太大会把细节压没设得太小会误导读图的人。我一般会根据项目温度统计直方图来定范围而不是随便填一个。如果要用颜色来表达等级也可以用 GDAL 做批量渲染gdaldem color-relief temperature.tif color_ramp.txt output_color.tifcolor_ramp.txt写一个三段映射15.0 0 0 255 35.0 255 255 0 65.0 255 0 0这样得到的是带 RGB 色带的温度图。不过我提醒一句color-relief 生成的 RGB 图只是可视化产品真正做数据分析、阈值提取、报告统计时还是要用原始的浮点 GeoTIFF别拿着一张贴好的图去量温度。4. 常见问题与排查技巧实录4.1 常见问题速查表我把实际项目里踩过的高频问题整理成了表格方便你到现场对照排查问题现象可能原因解决办法Pix4D 不识别 RJPG 温度选项版本过旧、缺少对应相机型号支持升级 Pix4D或先用 TSDK 转 GeoTIFF拼接后温度图有明显接缝重叠率不足、光照变化大提高航线重叠率选择稳定环境采集温度整体比实测高/低发射率设置错误、反射温度错误检查 RJPG 元数据中的发射率现场用接触式测温计校准输出 GeoTIFF 打开是黑白且无温度导出的不是温度指数而是普通 RGB检查 Index Calculator 中是否勾选温度指数温度和可见光照片错位两类相机云台中心偏移时间同步不准做相机配准使用同一坐标系输出弱纹理区域出现“拉花”热红外特征点不足增加重叠率可叠加可见光辅助匹配4.2 实例温度整体偏低 2°C 的排查过程有一次做某厂房屋顶光伏巡检拼接出来的温度地图看着很正常但现场用点温枪测一块组件表面温度是 58°C温度图读出来只有 56°C整体偏低 2°C。起初我怀疑是 Pix4D 指数输出的问题反复检查发现不是。后来回到原始 RJPG用 ExifTool 查看元数据发现相机里发射率被设成了 0.85。我们测的是光伏玻璃常见发射率在 0.85~0.95 之间设置为 0.85 会导致计算出的表面温度偏低。把该机型默认发射率改为 0.95 后重新处理温度图读数与点温计误差降到 0.5°C 以内。这件事之后我形成了固定习惯每次外业飞行前先确认被测物体材质把对应的发射率设置写入相机并在外业记录表里备注当时的反射温度、环境温度和相对湿度。这个习惯帮我避免了很多后期返工。4.3 实例输出没有温度色带还有一个常见问题用户说 RJPG 导入 Pix4D 后处理完毕正射图看起来是彩色的但好像只是调色板颜色不是真实温度。这种情况十有八九是在 Index Calculator 里没有选择温度指数或者 Pix4D 版本没有把该相机识别为热红外。解决思路很简单先在 Pix4D 中确认相机类型如果识别正常检查指数列表如果不正常回到原始 RJPG用 TSDK 或 ExifTool 验证元数据完整度。如果 RJPG 元数据本身缺失温度定标参数那无论 Pix4D 还是 TSDK 都没法还原真实温度只能重新采集没有别的捷径。4.4 独家避坑清单最后分享几条在长期实践中总结出来的经验按优先级排第一不要在刚开机时直接采集。热红外相机会有预热过程开机前十几分钟温度读数经常不稳定易发生整体偏移。我一般开机后在地面静止预热 5~10 分钟再起飞作业。第二不要拍完就用 8 位预览图判断效果。RJPG 的预览图经过色带拉伸看起来“对的”不一定真的对必须以温度读数或温度剖面为准。现场看数据最好带一台能实时读取 TSDK 温度的终端。第三不要为了缩短飞行时间降低重叠率。热红外数据拼不出来返工成本远高于多飞几分钟的成本。弱纹理环境我宁可重叠率设到 85%也不愿拿最后裂缝去赌。第四不要把温度图和可见光图直接叠在一起。两者分辨率、视角、时间都不完全相同叠加前必须先做配准和坐标统一。第五不要在完全没有温度校验的情况下直接交付报告。不管用 TSDK 还是 Pix4D最终温度地图都应该和现场若干测温点做交叉验证误差控制在合理范围内再交付。客户一旦拿点温枪抽查两三个点发现对不上后续很难再建立信任。4.5 精度提升的小技巧如果项目对温度精度要求特别高比如电力设备检测、工业热异常诊断我还会在航线里加入“校正目标”。简单说就是找一个发射率已知、温度稳定的参照物在采集前和采集后各拍几张。处理时用这个参照物的实测温度来校准整张温度图能把系统误差压下来。这个做法并不复杂却经常被忽略。温度地图最终是给人做判断的机器算出来的温度再漂亮也要经得起实测检验。把误差控制到 1°C 以内是热红外数据处理的基本职业素养。后处理工具只是放大器决定数据上限的还是采集细节和定标参数这个顺序千万别搞反。