前情提示:
该方法是在前面所有版本的基础上全新制作的完整详细版本,查看当前版本即可,不需要再查看前面的版本内容了。
该方法基于Python语言开发,适用于多款热红外相机(M4T需要改一下代码,使用M4T拍摄的请提前告知),适用于640x512大小的热红外图像,也适用于1280x1024大小的热红外图像,并且可以批量处理热红外照片,不需要一张一张进行处理,步骤详细完整,所以不用担心太多(这是汇总版,前面几个版本太零散了)。该方法唯一的缺点就是没有了相机型号信息(这个不影响后续的拼接,不用担心),目前我不知道怎么解决,如果有大佬知道,还望多指导指导。
我这边是使用大疆御2行业进阶版(M2EA)进行拍摄,得到热红外照片(R-JPEG,三波段),但是R-JPEG照片使用大疆红外热分析工具3(DJI Thermal Analysis Tool 3)打开设置才会显示温度值,使用其他软件就不行了,我需要的是热红外照片中的每个像素值就是温度值,而不是RGB值,下面我将详细讲解如何使用大疆TSDK进行二次开发,将热红外照片(R-JPEG)批量转换为单波段的温度值图像,使得图像中每个像素的数据不再表示颜色信息,而是表示了温度。然后使用Pix4D软件将温度值图像拼接成大图。
一、使用环境
系统版本:windows 10 64位(其他系统也可以)
IDE:visual studio code(这个轻量化,安装使用方便)
大疆TSDK版本:dji_thermal_sdk_v1.4_20220929
Pix4D mapper版本:4.4.12(大疆智图也可以)
1.基于大疆TSDK开发代码
Thermal SDK(后面统一称作TSDK)是大疆为用户提供的免费开源SDK,主要用于分析、处理红外照片。用户可以在Windows或Linux中借助该SDK开发出自己的专用软件,实现对R-JPEG红外照片的处理和温度测量等功能。
TSDK的测温结果输出,仍是一个图像,且分辨率于原图像大小一致。只是这个图像中每个像素的数据不再表示颜色信息,而是表示了温度。TSDK测量得到的温度结果都是物体表面辐射温度。
在TSDK里面有两种测温处理函数:
-
dirp_measure:像素数据类型为INT16(每个像素2字节),该值除以10以后即为温度值(如数值235表示23.5℃,-112表示零下11.2℃)
-
dirp_measure_ex:像素数据类型为FLOAT32(每个像素4字节),该值直接表示了该点的温度值
我们下面开发的代码中使用的是第一种测温处理函数。
下载大疆TSDK(版本dji_thermal_sdk_v1.4_20220929),将其解压缩,在vs code新建工程项目,将解压缩的文件夹dji_thermal_sdk_v1.4_20220929复制粘贴放入项目文件夹中(main.py是我编写的python脚本代码)
然后编写温度转换的python脚本代码,代码如下:
# 代码可以在windows系统运行,也可以在linux系统运行
# 代码既可以处理640x512大小的图像也可以处理1280x1024大小的图像
# 代码可以处理多种相机型号的热红外图像
# 代码可以批量处理热红外图像
def get_platform():
return platform.system()
def mkdir(path):
isExists = os.path.exists(path)
if not isExists:
os.makedirs(path)
print(f"Successfully create path: {path}")
return True
else:
shutil.rmtree(path)
os.makedirs(path)
print(f"Path: {path} already exists, delete and create again.")
return False
def jpg2tiff(inputpath, outpath, **kwargs):
# 完整代码可私聊我
*****
*****
def run(input_dir, output_dir, **kwargs):
# 完整代码可私聊我
*****
*****
2.设置距离、空气湿度、发射率和反射温度四个参数
在运行代码之前需要先知道热红外图像的四个参数:距离(飞行高度)、空气湿度、发射率和反射温度。下面是这四个参数的详细解释
distance,测温距离:
-
单位:米
-
范围:1~25,超过25时填写25即可(超过25米时测温精度会有所下降)
-
说明:待测目标的距离。红外热像仪接收物体自身辐射的红外线生成热像图,距离越远,红外辐射衰减越多。红外热像仪出厂时默认的标定距离一般是固定的,在这个距离测温最精确,距离过近或过远都会增大测温误差。
humidity,湿度:
-
单位:%
-
范围:20~100
-
说明:目标测量环境下的空气相对湿度。请根据实际测量环境配置,默湿度值配置是否准确将影响测温精度,但影响度较小。
emissivity,发射率:
-
单位:0.01
-
范围:0.10~1.00
-
说明:被测物体表面以辐射的形式释放能量相对强弱的能力。可参考“常见物质发射率表”进行配置,由于被测物体表面可能存在腐蚀、氧化等情况,实际发射率值与参考值可能存在一定差异。发射率配置是否准确将影响测温精度,且影响度较大。
reflection,反射温度:
-
单位:℃
-
范围:-40.0~500.0
-
说明:周围环境物体辐射的能量可能被待测目标表面反射,与待测目标辐射一同被相机接收,造成测温误差。如果周围环境没有特别的高温或低温物体,反射温度配置为环境温度即可。反射温度是否配置准确会影响测温精度,数值与环境温度偏差越大影响度越大。
下面教你如何快速知道这四个参数的值
下载大疆的热红外分析工具3(DJI Thermal Analysis Tool 3)。大疆红外热分析工具 3 主要用于分析和处理红外照片,它可获取拍摄物体关键位置的温度信息以及其他信息。
我们使用大疆的红外热分析工具3(DJI Thermal Analysis Tool 3)查看拍摄的热红外图像。直接添加文件夹:
选择其中任何一张热红外图像进行查看
可以看到右方有该热红外照片的相关信息,包括我们想知道的四个参数,这张热红外照片的四个参数值情况如下:
距离=6,
空气湿度=71,
发射率=1.00,
反射温度=24.0
还有设备型号、系列号、焦距、光圈和宽高等信息
我们在上面的Python代码中按照热红外照片显示的那四个参数值进行设置即可。当然,也可能有特别情况,比如说热红外照片在大疆热红外分析工具3中显示的温度值与实际情况不一样,那么这时候代码转换出来的温度图像可能就有些偏差。那么我们该怎么做呢?
如果查看热红外图像的最高温度和最低温度以及图像中某些点的温度与实际不一样,那么这时候可以在右侧直接调整那四个参数。个人建议先调整距离,因为距离这个参数对图像温度影响比较大,调整之后温度值变化明显,而其他三个参数对图像温度影响比较小。
修改参数之后可以看到温度值变化了,可以直接在最高温度和最低温度那里看到,点击保存可以将热红外的参数直接修改掉,但是如果不想修改,而是只想查看四个参数应该调整到什么值,那么可以只修改参数但是不保存,这样不会影响原图像的四个参数,如下:
个人建议不要保存,原始图像很重要。个人认为可以分两个不同的方法同时进行:
第一个方法:先记下调整的参数,然后使用代码进行转换,查看转换的温度值是不是与实际相符合。
第二个方法:先备份热红外原始图像,在大疆热红外分析工具3中修改备份的热红外图像的参数再进行转换。
对比上面两个方法,看哪一个方法转换得到的温度与实际更相符。我没有对比过这两个方法,对比过的可以留言或者私信交流讨论。
注意:在调整四个参数值的过程中需要注意四个参数的值不能超过大疆TSDK官方的取值范围,四个参数的范围可在上面的内容中查看到
这里展示一下转换得到TIF影像与大疆红外热分析工具3上显示的温度值(大家可以看看温度值差异)
图像1
图像2
图像3
图像4
从上面四张截图中可以看到转换得到的TIF影像显示的温度值范围与大疆热红外分析工具3中显示的温度值范围基本一致,不会出现差异很大的情况。
3.运行代码转换为单波段温度图像
设置正确的四个参数之后,运行代码就可以将R_JPG图像转换为TIF或者TIFF格式的图像了,需要TIF后缀还是TIFF后缀可以自行在代码里面修改,TIF或者TIFF图像中每个像素的数据不再表示颜色信息,而是表示了温度,转化完成后的TIF或者TIFF图像可以保留原始图像的位置信息(经纬度都在)。TIF格式的图像既可以在大疆智图中拼接,也可以在pix4D中拼接,TIFF格式的图像可以在pix4D中拼接,但是无法在大疆智图中拼接。
转换得到的温度图像有GPS信息,可以直接拼接
转换得到的温度图像可以使用Arcmap进行查看,可以看到温度图像是单波段的,也可以看到温度图像的最高温度和最低温度,可以在软件里面查看每一个像素点的温度值
因为是演示所以我就没有修改参数直接运行代码了,可以看到640x512大小图像的温度值和1280x1024大小图像的温度值差异大,这是因为两者使用不同的相机进行拍摄,四个参数的值也不一样,使用统一的参数值进行转换温度值会有显著差异。
二、pix4D拼接温度图像
1.拼接步骤
打开pix4d,新建项目,添加路径(建议使用这个,一次性导入全部)
点击Next会显示读取EXIF数据
不用设置什么,直接点Next
不用设置什么,直接点Next
选择左侧的“Thermal Camera”,取消勾选“开始处理”,点击“Finish”
选择左下方的“处理选项”
选择“3.DSM,正射影像和指数”,勾选图中所标选项,然后点击“OK”
点击“开始”即可开始拼接,拼接需要时间比较多,慢慢等
合成结果如下所示(合成影像保存在工程文件路径4_index\project_data\reflectance_gsd\tiles下):
Pix4D也可生成指数图,根据需要生成相应的shp文件或Geotiff文件
我看到有人担心Pix4D拼接得到的图像有空洞,目前我倒是没有看到有,拼接得到的图像还是不错的。我也看到有人使用大疆智图进行拼接,但是因为我试用大疆智图的时间过了,所有并没有使用大疆智图拼接过,并不知道过程和结果怎么样,这里就不说什么了。有使用过大疆智图拼接的可以留言或者私信交流讨论
2.拼接报错问题和解决方案
我在拼接M3T相机的时候报错,提示:
[Error]: No calibrated cameras.
和
[Error]: Error e0046: Processing failed. No calibrated cameras.
这个问题我还没有解决,正在查找解决方案。出现该错误的原因可能是航向重叠没有大于等于80%,旁向重叠没有大于等于70%;也有可能是该热红外相机拍摄的数据在前面的代码处理后相机参数不对了,需要重新调整相机参数,但是我从去年开始就转了很多热红外相机拍摄的热红外照片,都没有出现问题,唯独这次的数据一直报错,我怀疑是数据问题,拍摄热红外照片的时候操作不规范、不专业(后续解决后会补充相关内容)
PS:本人也不是什么都懂,还在不断学习当中,希望跟大家互相学习,一起进步