ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

大疆热红外数据处理:从R-JPEG解析到Pix4D温度热图

大疆热红外数据处理:从R-JPEG解析到Pix4D温度热图 搞热红外无人机数据处理的同行应该都遇到过这个场景大疆H20T、XT2这些负载拍回来的热影像落地之后你双击图片电脑自带的看图工具弹出来一片灰不拉几的画面甚至直接报格式错误。等你千辛万苦找了个能开的软件看到的还是一张没有温度信息的普通灰度图那感觉跟拿到了藏宝图却不知道密码差不多。问题就出在这些文件的格式上。它们不是普通JPEG而是大疆特有的R-JPEG。平时我们用的JPEG每个像素存的就是红绿蓝三个颜色通道R-JPEG除了包含一帧可用于显示的YUV画面外还把每个像素对应的温度原始数值、增益、偏置、辐射校正参数全部塞进了JPEG扩展信息段里。想从这堆原始数据里拿到真正可用的辐射温度再把成百上千张热影像拼成一张带温度信息的红外正射影像就需要一条完整工具链来打通解析R-JPEG用大疆TSDK空三和拼图用Pix4D mapper最后才是温度热图的渲染和输出。这篇文章我就用一套实际项目数据把从R-JPEG到温度热图的整个过程拆开讲透包括大疆TSDK里的温度解析原理、为什么要先把R-JPEG转成TIFF、Pix4D mapper里热红外模板的参数怎么设置、最后怎么导出带温度值的热图。适合正在做热红外航测、设备巡检和建筑检测的同行参考也适合刚接触红外数据处理的入门者搞清楚整套流程的逻辑。1. 先搞明白R-JPEG、TSDK和Pix4D之间是什么关系1.1 R-JPEG为什么热影像的照片不能直接看大疆热成像负载输出的文件扩展名虽然是JPG但它的数据结构和普通照片完全不同。普通JPEG只关心怎么把场景的颜色信息压缩保存人眼看到什么文件里记录的就是经过色彩映射后的RGB数值。而热成像相机本质上是测量每个像素接收到的红外辐射量它记录的是物理量不是颜色。这个物理量在R-JPEG里以原始DN值、温度数值等形式存在。我在实际处理中观察过打开R-JPEG的二进制结构文件头部除了标准JPEG的SOI、APP0这些标记还会多出大疆自定义的APP6段里面存的热红外元数据信息量很大包括传感器型号、发射率设置、环境温度、反射温度、相对湿度、大气透射率等几十个字段。不过这些字段在普通软件里会被直接忽略所以拿看图工具打开R-JPEG最多看到经过内置调色板预处理过的伪彩色图甚至因为编码差异看到的是一张偏色严重的马赛克。更麻烦的是R-JPEG里的辐射温度数据如果直接用像素值去解读不同机型、不同温度范围得到的数值是没有可比性的。必须依靠对应的解算SDK把目标发射率、环境反射、大气路径衰减这些参数代进去才能还原出真实物体表面温度。这也是R-JPEG不能被当普通图片来用的根本原因。1.2 大疆TSDK在这个流程里扮演什么角色大疆TSDK准确说叫DJI Thermal SDK是专门用来解析大疆热成像负载数据的工具包。它提供了跨平台的C/Python接口核心能力就是读取R-JPEG文件解析里面的温度辐射数据输出成多种可用格式。我在项目里常用的输出类型有这么几种第一种是原始辐射TIFF每个像素存储的是32位浮点温度值单位可设为摄氏度或开尔文这类文件可以被专业遥感软件直接读取第二种是调色板图像SDK会按你指定的色带把温度映射成伪彩色图适合快速预览第三种是温度矩阵文本每个像素一行包含坐标和温度值适合做逐点统计。TSDK还有一个非常重要的能力就是设置辐射校正参数。热红外测温不是简单地拿像素值乘以系数发射率、反射温度、大气温度、相对湿度都会影响最终结果。TSDK提供了一套完善的参数接口我可以在解析数据时把采集现场的实际条件输进去让输出的温度值更贴近真实物理温度。如果你处理的光伏板、电力设备这类高发射率目标发射率设置误差1%最后温度误差可能就会从0.5摄氏度差到2摄氏度这个环节是躲不开的。1.3 Pix4D mapper在这里负责什么活Pix4D mapper的主要任务是把几百张带有位置姿态信息的热红外影像通过特征匹配、空三解算、密集匹配、正射纠正和镶嵌拼接成一张完整测区的红外正射影像。它本身不是温度计算工具但能科学地管理带地理信息的影像数据集。值得强调的是Pix4D mapper支持热成像相机模型。在项目建设时有专门的Thermal Mapping流程模板可以选择加载温度TIFF并按照热红外传感器的成像几何去解算内外方位元素。热红外影像和可见光影像有个明显区别就是纹理信息极其微弱普通可见光空三常用角点特征在热图上很难找到。Pix4D在处理这类数据时会调整特征提取策略也需要依赖无人机记录的RINEX/RTK位置信息来约束空三解算。用好了它输出的Orthomosaic直接带温度值叠加色带后就能看到整体测区的温度分布热图。2. 方案设计怎么设计一条从R-JPEG到温度热图的完整数据链路2.1 采集前的关键决策点很多朋友一上来就飞飞完再考虑数据处理结果往往返工。我在这个项目上提前把几个变量定死了。首先是航线重叠率。热红外影像纹理少特征点稀疏要想拼接成功重叠率必须比可见光高。我的经验是航向重叠率至少做到80%旁向重叠率做到70%如果测区是草地、水面这类均匀纹理区域建议航向重叠率直接拉到85%。虽然会增加作业时间和数据量但能显著降低空三失败概率。其次是飞行高度和地面分辨率的关系。热成像传感器的IFOV固定飞行高度越低地面分辨率越高温度细节越清楚但覆盖效率下降。做电力杆塔巡检一般飞25到40米高度对大面积厂房屋顶做建筑热工检测飞到100到120米也能接受。Pix4D拼接红外影像对几何精度要求没有可见光那么苛刻但GSD太大时小目标温度异常可能直接被平滑掉就失去检测意义。还有采集时间窗口这一点很多人容易忽略。白天太阳辐射会让被检测物体表面温度变化剧烈红外影像里的温差更多反映太阳照射角度而不是物体内部问题。所以做建筑热工检测标准做法是选在太阳落山后2到3小时或凌晨让表面温度趋于稳定。做光伏航测一般选在中午前后此时故障组件和正常组件间的温差最明显。同一个测区早晚拍两组数据处理出来的温度热图会有完全不同的解读结论必须有意识地结合任务目标去规划。2.2 一条已经被验证过的处理流水线大疆热红外数据处理在实际项目里主流的有两条路线。一条是直接拿R-JPEG原始文件拖进Pix4D mapper让它自己识别处理。Pix4D近年版本确实支持部分大疆热成像产品但实测下来兼容性时好时坏特别是H20T配合大疆最新固件时偶尔会出现元数据读取不完整、发射率参数丢失的情况。另一条路线比较稳先用大疆TSDK把R-JPEG统一转成带温度信息的TIFF再把这组TIFF交给Pix4D mapper处理。我自己做项目时更倾向后者。原因有三点第一TIFF是标准格式每个像素的温度值明确可见数据质量一目了然第二TSDK转换时可以批量设置统一的辐射校正参数不会因为某个文件的元数据缺失导致整块温度基准不一致第三万一Pix4D处理失败团队还能改用其他软件接续这个TIFF数据集是通用的。这条流水线的具体环节是RAW格式的R-JPEG数据 → 大疆TSDK批量解析和辐射校正 → 输出带地理参考的温度TIFF → Pix4D mapper新建热成像项目 → 空三计算与正射拼接 → 导出带温度值的正射影像tif → 在QGIS或ArcGIS里使用色带渲染温度热图 → 按需导出温度数值或叠加分析报告。2.3 为什么要先转换而不是直接拼接有人会问Pix4D既然支持热红外为什么非要转换一道我在调试时发现过一种情况直接导入R-JPEG时Pix4D解析出来的色阶范围是按照JPEG显示编码来的并非真实辐射温度。比如一个测区真实温度范围在20到50摄氏度但在某块数据里解析后得到的DN最小值是0最大值是255像素间的线性关系是对的可绝对温度值被抹掉了。那样拼出来的是相对温度分布图不能用于绝对温度判读整个项目就白做了。TSDK转换出来的温度TIFF存储的是带量纲的浮点温度值Pix4D在读取时会把这个温度值保留下来。处理完成后的正射影像每个像素都有明确的摄氏温度不管是后期做阈值分割还是导出温度异常点坐标都能直接拿数值去算不用再依赖调色板的视觉映射。这个“绝对温度”才是做设备状态诊断和缺陷等级评估的硬指标整个流程的基石就在这里。2.4 方案的局限性和适用边界这套方案肯定不是万能的我事先说明一下它的局限性。第一它只适合大疆热成像负载其他品牌红外相机的数据需要采用各自SDK解析流程思路可以复用但工具实现要换。第二Pix4D在热红外空三上的成功率低于可见光如果测区范围非常大、地形起伏严重、又没有POS辅助数据可能出现大量空三失败或空洞。第三热红外数据的坐标精度取决于飞控记录的POS精度和IMU姿态精度不做控制点直接就输出像控级精度是不现实的至于热红外影像的像控点布设需要专用靶标并不是纸板就能解决。不过对绝大多数日常巡检、应急评估、建筑热工检测场景这套流程已经足够稳健了。在后续章节里我会按照这条链路一步步展示具体操作步骤和参数。3. 实操过程用TSDK解析R-JPEG并在Pix4D中生成温度热图3.1 用大疆TSDK把R-JPEG转换成温度TIFF我选择的开发环境是Ubuntu 20.04 Python 3.8大疆TSDK提供了比较完整的Python绑定。第一步是从大疆开发者官网下载对应版本的Thermal SDK解压后把lib目录和include目录放到自己的工作目录。大疆TSDK对Python的example代码非常实用里面包含了读取R-JPEG、输出温度矩阵、生成伪彩色图等多个样例函数。批量转换的关键代码如下我简化了辅助部分保留核心逻辑import os from dji_thermal_sdk import RJPEGParser # 自定义输出目录 input_dir /data/rgb_raw/ output_dir /data/thermal_tiff/ os.makedirs(output_dir, exist_okTrue) # 以实际图片创建一个解析器实例 parser RJPEGParser() for img_name in os.listdir(input_dir): if img_name.lower().endswith(.jpg) or img_name.lower().endswith(.jpeg): img_path os.path.join(input_dir, img_name) # 解析R-JPEG parser.open(img_path) # 调取原始热红外图像可以是raw还是tiff这里直接用tiff输出 parser.get_raw_image(out_pathoutput_dir)这里有个大坑要提醒parser.get_raw_image默认输出的是DN值图像并不是温度图像。要得到温度TIFF必须调用辐射转换相关的接口并设置参数。大疆TSDK中负责这一功能的类是RadiometricCalibration不同版本接口名有差异但逻辑一致先把原始图像数据读进内存然后传入发射率、反射温度、大气温度、相对湿度、距离等参数得到每个像素的辐射亮度再反算成温度值。实际项目中我是直接调SDK例子里的calibrate_gain_and_offset相关的函数组合来实现的。由于不同机型的定标文件不同H20T和XT2会各自匹配对应的校正参数SDK会根据R-JPEG头部的传感器型号自动加载。在批量处理时先拿一张R-JPEG做单张验证确认输出的TIFF温度值跟现场黑体或接触式测温仪数据接近再跑全量。设置辐射参数的地方我习惯用一个配置文件统一管理避免每张图手动传参{ emissivity: 0.95, reflective_temperature: 20.0, atmospheric_temperature: 15.0, relative_humidity: 40.0, distance: 50.0 }这段参数的物理含义我解释一下。发射率0.95对应常见建材、工业设备表面如果是高反射金属表面发射率要往下降到0.3到0.6否则温度全部被环境反射污染。反射温度20是指周围高温物体会在目标表面留下反射辐射如果不填默认值夏季室外环境会把金属表面温度估高。距离50对应当时航高影响大气路径透射率天气越潮湿距离越敏感。参数设错温度偏差几摄氏度都是正常的。校验方式是选取测区内某个已知温度的地物对比SDK输出值和现场红外测温枪读数偏差控制在正负1.5摄氏度以内再继续。批量转换完成后检查输出目录里每一张TIFF拉几张开到QGIS里看看温度分布是否连续确认没有全图恒温、纯黑、剧烈跳变这些异常情况再进入下一步。3.2 Pix4D mapper项目初始化新建项目和选择热成像模板打开Pix4D mapper在项目向导里选择“新建项目”。输入项目名称和存放路径后添加影像时直接选中刚才生成的整个temperature_tiff目录软件会列出所有TIFF文件。此时最关键的操作是往下看“图像属性”的相机模型识别。Pix4D对自定义格式支持不是百分百识别有时会把它当成普通RGB相机。这时候需要手动更改图像属性选择相机型号为“Thermal Mapping Camera”或者根据照片尺寸手动设置焦距、像元尺寸等参数。大疆H20T热成像镜头的传感器参数可以从R-JPEG的APP6段元数据里读到。我在实践中有个经验Pix4D如果识别成未知相机可以先选“Thermal Camera”预设然后手动把焦距填成镜头标称值。H20T的热成像镜头等效焦距约13mmXT2不同焦距版本有9mm、13mm、19mm等具体以镜头铭牌为准。不建议让Pix4D完全自动估计焦距因为热红外影像纹理稀少自动估焦在后面的空三里很容易不稳定。接下来是处理模板的选择。Pix4D mapper在向导页面里有“处理模板”选项常见的是“3D Maps”、“Ag RGB”、“Ag Multispectral”这些。热红外项目我一般选“3D Maps”模板因为它会同时输出正射影像、DSM并且允许后续调整融合算法。如果你只想要二维正射图也可以选“Ag RGB”模板后手动开启“热成像”选项。关键是确保项目属性里的图像坐标系正确。如果无人机导出的POS信息包含经纬度高程Pix4D会自动读取EXIF里的GPS位置R-JPEG转换过来的TIFF里如果带了GeotagPix4D会拿来用。项目创建完成后第一步会先跑“初始化处理”包括特征点提取、影像匹配、相机自检校和稀疏点云生成。这一步对热红外数据来说是最容易翻车的。如果失败一般通过查看“质量报告”里的“影像匹配”模块能很快定位问题。我遇到比较多的是因为海拔或经纬度信息错误导致影像初始位置散开特征点匹配建立不起联系。出现这种情况第一步先检查EXIF里的GPS坐标是否存在异常跳点可以用QGIS把所有影像的位置点画出来看看再决定是剔除异常POS还是修正坐标。3.3 跑空三时容易忽视却影响出图质量的参数空三处理是整个项目里最核心的算法环节Pix4D会自动完成但有几个参数对红外影像特别关键默认值未必适合。第一个是“特征点图像比例”。在“处理选项 → 2. 匹配 → 特征点”里Pix4D默认按“标准每张图4096点”处理。热红外影像的纹理少特征点数量往往不够我实际操作中会把该选项调到“高每张图8192点”或者“超高每张图16384点”。代价是处理时间明显增加但空三解算的成功率会大幅上升。如果项目涉及屋顶、光伏板这类强边缘但弱纹理的场景调高这个参数基本能解决一半的匹配失败问题。第二个是“匹配窗口大小”。热红外影像重叠区域里的亮度差异可能受发射率影响同一个物体在不同角度拍摄时表面温度表现不同像素值不一定稳定。如果出现大面积匹配失败可以尝试把匹配窗口大小从默认值加大使算法能捕捉更大的结构特征。第三个是POS精度。在“处理选项 → 1. 初始处理 → 重设”里需要检查“图像坐标系”里对GPS精度的预设。大疆自带RTK的POS精度能到厘米级但非RTK模式只能到米级到十米级。如果Pix4D发现GPS精度过高如0.1m但实际数据是松散GPS会因为几何约束过强而反复解算失败。我把这类数据直接改成“标准5m”或“低精度10m”空三反而能快速收敛。热红外数据很少能通过全自动空三一次性成功Pix4D提供了“快速检查”功能在跑完初始处理后先不急着生成正射而是打开“射线云”、“控制点”面板看看连接点分布是否均匀。我发现热红外数据的连接点经常集中在边缘和角落中间区域连接点极稀疏。解决方法是在“处理选项 → 2. 匹配 → 链接”中勾选“启用重叠率计算”并把“最小图像重叠”从默认的2提升到3强制每一个点都被至少3张图覆盖这样后续正射拼接的接缝会自然减少。3.4 生成红外正射影像和温度热图空三解算成功后进入正射影像生成阶段。在“处理选项 → 3. 正射影像 → 融合算法”里我会选“平均”模式。Pix4D提供“最适图像”和“平均”两种融合方式。对于红外温度图“最适图像”会把颜色最接近中央的图像选进来适合需要清晰纹理的可见光而对温度数据更希望每个像素是多次观测的平均值这样可以减少噪声、平滑瞬态差异所以我基本固定用“平均”模式。另一个关键参数是“正射影像分辨率”。默认值是相机GSD的一倍可以不管。但如果是想把红外正射和可见光正射叠加分析建议把分辨率设置为与可见光正射一致保证栅格对齐方便。处理完成后Pix4D会输出Orthomosaic文件常见的是项目文件夹\3_dmosaic\0_orthomosaic.png和对应的_tfw世界文件但是PNG文件其实已经丢失了绝对温度值。要得到带温度值的TIFF必须在“处理选项 → 3. 正射影像 → 附加输出”里勾选“保存完整分辨率正射影像含地理参考的TIFF”。拿到这个tif之后温度热图的渲染我一般放在QGIS里做。加载GeoTIFF后在图层属性的“渲染类型”里选择“单波段伪彩色”把颜色渐变选为Turbo、Inferno或Viridis我个人最喜欢Turbo高温区是深红低温区是深蓝色视觉层次分明。重点是把“最小”和“最大”值按目标测区的实际温度范围调整。Pix4D输出的温度TIFF默认拉伸范围可能很宽比如从-10到120直接渲染会导致大部分区域颜色灰扑扑的看不出温差分布。比如测区是光伏板夏天晴天表面温度大致在30到60摄氏度我就把渲染范围设成25到65这样热斑立即暴露。QGIS里调好色带后还可以利用栅格计算器做进一步分析。比如用温度阈值提取异常区域表达式thermal1 50就能筛出所有大于50摄氏度的像素生成一个异常二值栅格再通过“栅格转矢量”工具导出异常多边形叠加到测区底图上就能直接算出异常区域面积和位置。如果需要导出每个像素的温度统计可以用“栅格值到点”工具把温度值赋予测区内的矢量点再在属性表里做统计分析得到最高温、最低温、平均温度、温度异常标准差等指标。如果项目里还采集了可见光正射可以在QGIS中把红外正射和可见光正射同时加载通过混合模式能快速目视对照。比如红外显示的低温区域是否对应可见光里的阴影、水体高温区域是否对应裸露金属、运行设备。这样叠加分析能让诊断结论更有说服力。4. 常见问题与排查技巧实录4.1 R-JPEG打不开、导入Pix4D失败怎么办平时收到一堆后缀为JPG的文件双击打不开或者打开是花屏这是对R-JPEG格式不了解带来的第一道坎。解决方法就是老老实实用大疆TSDK转换。需要特别注意的是TSDK有不同版本对应不同大疆负载H20T和XT2的算法接口不完全兼容一定要确认SDK版本与负载型号匹配。如果TSDK解析时报文件格式错误排查思路是先确认文件是否通过无人机自带SD卡直接拷贝中间有没有经过手机App、微信等工具转发因为有些传输工具会把R-JPEG转成普通JPG导致温度数据丢失那样就真的救不回来了。Pix4D导入R-JPEG失败还有一种常见情况是文件名编码问题。大疆默认不带中文但有些用户自己重命名过比如“厂房1号_JPG”Pix4D可能无法正确识别相机型号。规范做法是数据拷贝后立即批量统一命名比如thermal_0001.TIF不要保留特殊字符和空格。4.2 温度数值整体偏高或偏低怎么校正温度数值异常第一嫌疑是辐射校正参数设置不对其次才怀疑传感器本身故障。我在夏季做外墙检测时遇到过一次整体偏低3摄氏度的现象后来发现是发射率参数填了0.9而实际墙面涂层发射率约0.96。修改发射率后重新解析温度数据立即恢复正常。经验是发射率未知时用0.95的通用值反射温度设为25摄氏度比0摄氏度更接近夏季常见环境。如果单张图正常但跑完正射后温度热图出现整块区域和周边不一致的色块这多数是每张图辐射校正参数不一致造成的。比如飞行中途从逆光转为顺光有些自动设置会影响曝光增益温度数据出现段差。这种需要在Pix4D拼图前检查温度TIFF的直方图把明显异于整体的影像剔除或者重新统一辐射参数后再转换。宁可少几张图也不能把温度基准不统一的数据硬拼进去。当温度数据的毫米级细节无法满足要求时要先检查飞行重叠率是否足够。低于60%重叠率的热红外数据拼出来的正射马赛克感很强容易在中心区域出现假温度异常。4.3 空三失败、拼接错位和空洞怎么排查热红外空三失败我大致归成三类原因。第一类是POS数据错误GPS坐标飘移或姿态角跳变在Pix4D质量报告里能看到“自动校准”的相机参数出现不合理值如焦距变成0或主点偏移巨大。此时先看原始热影像EXIF里的GPS是否连续有异常点就把对应影像从列表里移除。第二类是重叠率不足。如果你的航线设计是按可见光标准规划的热红外很可能因为视场角不同、云台角度偏差等原因导致实际重叠率不够。我验证过一组数据可见光按旁向60%设计没问题热红外同样航线下实际重叠率只有40%拼接空洞严重。遇到这种情况不要硬跑重新规划航线增加旁向重叠率是唯一有效解法。第三类是测区缺乏纹理比如大片水面、均质沙地、雪山等天然低纹理区域特征点提取数量会骤降。应对办法包括在航线上增加一定角度的倾斜摄影路径给算法提供更多几何信息或者在测区周边布设热红外被动靶标也就是在作业前放置几个与背景温差明显的高温或低温物体让算法有稳定锚点。这个技巧在野外大范围电力巡检时非常管用。4.4 别把坐标系和参考影像搞错红外正射影像的坐标系通常跟POS数据的坐标系一致。如果无人机RTK用的是CGCS2000经纬度Pix4D默认会以东经、北纬和高层输出后期在QGIS里要设置正确的CRS否则叠加底图时是全歪的。如果用的是WGS84航测二维正射叠加到地方坐标系时需要做投影转换。还有一种情况是可见光和热红外分别出了两套正射影像直接叠加时发现错位。这是因为两种相机传感器物理位置不同拍摄同一片区域时存在视差无人机POS也没能做到完全一致。解决方法是先分别生成两套正射影像然后在QGIS里用“地理配准”或“配准工具”手动添加控制点把红外正射对齐到可见光正射上。控点要选在温度边界清晰、可见光特征明显的目标上比如房角、塔基、路灯杆根部至少选5到7个均匀分布的点配准后整体误差能控制在像素级然后就可以放心地做叠加分析了。5. 一点实际项目中的体会整套流程我用下来最大的感受是热红外数据处理链条很长但每个环节的坑都是可以提前预判的。R-JPEG解析和辐射校正是温度数据准确性的根基转换之前先做几张图的参数验证能省下后面大量返工时间。Pix4D的空三稳定性则依赖航测设计阶段的冗余度和热红外数据自身的特点紧密相关重叠率给足、匹配参数调高就没有太大问题。至于温度热图的呈现其实是最简单的一环只要前面温度TIFF做扎实QGIS里拖个色带就能输出很漂亮的图。最后再分享一个我的个人习惯每次项目处理完我会把R-JPEG原数据、转换后的温度TIFF、Pix4D工程文件、QGIS渲染样式和最终热图按目录分层归档。因为巡检类项目往往会做同一测区的定期复测有了统一的数据格式和渲染参数前后两期温度热图可以直接做差值分析设备劣化趋势一眼就能看出来。这条经验在设备状态评估报告里真的能派上大用场比单看一期绝对温度值有价值得多。
返回列表