TSDK处理大疆H20T热成像图像记录

news/2024/12/1 0:25:27/

TSDK处理大疆H20T热成像图像小白记录

  • TSDK的环境配置
  • TSDK的调用
  • .raw转.tif
  • 图像的exif信息
  • pix4d拼接
  • pos编辑
  • 全部代码

记录我用TSDK处理热成像图片的过程

TSDK的环境配置

由于不会调用SDK,所以我将下载的TSDK中sample文件夹用VS打开,找到dji_irp.cpp文件,复制代码。创建新的项目,创建tsdk.cpp文件,将代码粘贴进去。
tsdk.cpp需要链接argagg.hpp,dirp_api.h和dirp_wrapper.h头文件以及libdirp.lib库文件。在tsdk.cpp所在文件夹中创建Libs文件夹,在Libs文件夹中创建icn文件夹和lib文件夹。将下载的TSDK中tsdk-core目录下api文件夹内的文件复制到icn文件夹中,将sample\argparse目录下的文件也放入icn文件夹内;将tsdk-core/lib/windows/release_x64目录下所有.lib文件复制到lib文件夹中,将所有.dll文件和.ini文件复制到tsdk.cpp所在文件夹中x64\Debug文件夹下,与tsdk.exe放在一起。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在tsdk项目中选择调试>tsdk调试属性>C/C++>常规中,将附加包含目录设置为icn文件夹;在tsdk项目中选择调试>tsdk调试属性>连接器>常规中,将附加库目录设置为lib文件夹;在tsdk项目中选择调试>tsdk调试属性>连接器>输入中,将附加依赖项设置为libdirp.lib。至此配置成功。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在调试>tsdk调试属性>调试中输入命令参数-h再运行可以查看帮助

TSDK的调用

通过python代码调用tsdk.exe,批量处理热成像图片,生成存储温度信息的.raw文件。

import ostsdk = r'C:\Users\poppip\source\repos\tsdk\x64\Debug\tsdk.exe'
##tsdk.exe的储存位置
path='F:/thermalsensingimage/DCIM/DJI_202207221723_011_/'
##拍摄的rJPG的储存位置
savepath = "C:/Users/poppip/Desktop/test/tempture/DJI_202207221723_011_/"
##处理结果的储存位置
os.makedirs(savepath,exist_ok=True)distance=25.0
emissivity=0.95
humidity=45
reflection=51.8 
##参数根据实际情况设置def use_tsdk(tsdk, path, savepath):print('start')imgnamelist=os.listdir(path)for imgname in imgnamelist:if "T" in imgname:##带T的图像是温度图像portion = os.path.splitext(imgname)coreimgname = portion[0]param = '-s '+ path + imgname + ' -a measure -o ' + savepath + coreimgname + '.raw' + ' --distance ' + str(distance) + ' --emissivity '+ str(emissivity) +' --humidity '+ str(humidity) + '--reflection ' + str(reflection)##选择的模式是measure输出的结果是温度信息,不是原始信息r_v = os.system(tsdk+' '+param)print (r_v)##输出的为tsdk.exe运行的返回值use_tsdk(tsdk, path, savepath)

.raw转.tif

将.raw文件中的值除以10之后为温度值,转为.tif文件以备后续使用。python代码

import os
import opencv
import numpy as np
savepath = "C:/Users/poppip/Desktop/test/tempture/DJI_202207221723_011_/"def raw_to_tif(path, rows, cols, channels):print('to .tif start')files = os.listdir(path)for file in files:portion = os.path.splitext(file)if portion[1] == '.raw':realPath = path + fileimg = np.fromfile(realPath, dtype='uint16')img = img/10##除10之后为温度值img = img.reshape(rows, cols, channels)fileName = portion[0] + '.tif'tif_fileName = os.path.join(path, fileName)cv2.imwrite(tif_fileName, img , (int(cv2.IMWRITE_TIFF_COMPRESSION), 1))os.remove(realPath)   ##delete .raw file,如有需要,可以不删除else:print(file + ' it is not .raw file')print('to .tif finsh')raw_to_tif(savepath, 512, 640, 1)

图像的exif信息

转出来的.tif文件没有exif信息,无法定位。将exif信息从rjpg图像中提取出来,写入.tif文件的python代码

from pyexiv2 import Image
import ospath='F:/thermalsensingimage/DCIM/DJI_202207221723_011_/'
savepath = "C:/Users/poppip/Desktop/test/tempture/DJI_202207221723_011_/"def exifrw(path,exif_path):print('exifr&w start')i=0files = os.listdir(path)read_files = os.listdir(exif_path)for read_file in read_files:if "T" in read_file:portion = os.path.splitext(read_file)file = portion[0] + '.tif'if file in files:file_path = os.path.join(path,file)img = Image(file_path)exif_file = os.path.join(exif_path, read_file)imge = Image(exif_file)exif = imge.read_exif()img.modify_exif(exif)imge.close()img.close()else:i=i+1print(str(file)+"unfinish")##检查是否所有.rjpgd的温度文件都完成了全部转换print('exifr&w finish')print(str(i) + " files can not be processed")print('end')
exifrw(savepath,path)

pix4d拼接

最后使用pix4d进行图像拼接,不知道为什么大疆智图无法拼接转换后的图像。

pos编辑

以上方法处理exif信息只能读取地理信息,无法读取精度及航向角等信息,拼接的图像不准,可以用大疆智图导出pos信息,经过编辑,导入pix4d。
在这里插入图片描述
pos编辑代码,每组信息单独切片的部分还能简化。

import ospath = 'C:/Users/poppip/Desktop/test/temperature/DJI_202207221723_011_humidity45/'
pos_path= 'F:/thermalsensingimage/DCIM/DJI_202207221723_011_/'posread = os.path.join(pos_path,"pos.txt")
f = open(posread,encoding='utf8')
poswrite=os.path.join(path,"posT.txt")
for line in f:if "T" in line:i1=line.find(",")line1=line[i1-29:i1-4]#nameline2=line[i1+1:]i2=line2.find(",")line3=line2[i2+1:]line2=line2[:i2]#lati3=line3.find(",")line4=line3[i3+1:]line3=line3[:i3]#loni4=line4.find(",")line5=line4[i4+1:]line4=line4[:i4]#altitudei5=line5.find(",")line6=line5[i5+1:]line5=line5[:i5]#yawi6=line6.find(",")line7=line6[i6+1:]line6=line6[:i6]#pitchi7=line7.find(",")line8=line7[i7+1:]line7=line7[:i7]#rolli8=line8.find(",")line9=line8[i8+1:]line8=line8[:i8]#horizontali9=len(line9)line9=line9[:i9-1]#verticalline = line1+'.tif '+line2+' '+line3+' '+line4+' '+line6+' '+line5+' '+line7+' '+line8+' '+line9#for pixprint(line)with open(poswrite,"a") as fs:fs.write(line+"\n")

全部代码

除了tsdk的全部python代码,之前的分步代码使用时应去除##注释。这是我使用TSDK的全部过程,本人只是个小白,很多步骤有待推敲,所有代码仅供参考。

import os
import cv2
import numpy as np
from pyexiv2 import Imagetsdk = r'C:\Users\poppip\source\repos\tsdk\x64\Debug\tsdk.exe'
path='F:/thermalsensingimage/DCIM/DJI_202207221723_011_/'
savepath = "C:/Users/poppip/Desktop/test/tempture/DJI_202207221723_011_/"
os.makedirs(savepath,exist_ok=True)distance=25.0
emissivity=0.95
humidity=45
reflection=51.8def use_tsdk(tsdk, path, savepath):print('start')imgnamelist=os.listdir(path)for imgname in imgnamelist:if "T" in imgname:portion = os.path.splitext(imgname)coreimgname = portion[0]param = '-s '+ path + imgname + ' -a measure -o ' + savepath + coreimgname + '.raw' + ' --distance ' + str(distance) + ' --emissivity '+ str(emissivity) +' --humidity '+ str(humidity) + '--reflection ' + str(reflection)r_v = os.system(tsdk+' '+param)print (r_v)def raw_to_tif(path, rows, cols, channels):print('to .tif start')files = os.listdir(path)for file in files:portion = os.path.splitext(file)if portion[1] == '.raw':realPath = path + fileimg = np.fromfile(realPath, dtype='uint16')img = img/10img = img.reshape(rows, cols, channels)fileName = portion[0] + '.tif'tif_fileName = os.path.join(path, fileName)cv2.imwrite(tif_fileName, img , (int(cv2.IMWRITE_TIFF_COMPRESSION), 1))os.remove(realPath)   ##delete .raw fileelse:print(file + ' it is not .raw file')print('to .tif finsh')def exifrw(path,exif_path):print('exifr&w start')i=0files = os.listdir(path)read_files = os.listdir(exif_path)for read_file in read_files:if "T" in read_file:portion = os.path.splitext(read_file)file = portion[0] + '.tif'if file in files:file_path = os.path.join(path,file)img = Image(file_path)exif_file = os.path.join(exif_path, read_file)imge = Image(exif_file)exif = imge.read_exif()img.modify_exif(exif)imge.close()img.close()else:i=i+1print(str(file)+"unfinish")print('exifr&w finish')print(str(i) + " files can not be processed")print('end')use_tsdk(tsdk, path, savepath)
raw_to_tif(savepath, 512, 640, 1)
exifrw(savepath,path)

http://www.ppmy.cn/news/285070.html

相关文章

JavaScript-T2

JavaScript-T2 前言 本次主要讲解的知识点是: JavaScript自定义函数 JavaScript系统函数 JavaScript 事件 JavaScript 的常用事件 JavaScript自定义函数 函数就是为了完成程序中的某些特定功能而进行专门定义的一段程序代码 函数包括自定义函数和系统函数 使用函数…

MRI:T1 T2 T1WI T2WI笔记

T1观察解剖结构较好。 T2显示组织病变较好。 水为长T1长T2,脂肪为短T1短T2。 长T1为黑色,短T1为白色。 长T2为白色,短T2为黑色。 水T1黑,T2白。 脂肪T1白,T2灰白。 T2对出血敏感,因水T2呈白色。 T…

磁共振中的T1, T2 和 T2*的原理和区别

从物理的角度,要理解这几个概念的区别,需要对原子核的磁化有所了解,本文通过一些图示对这几个概念进行简明的介绍。 首先,磁共振最基本的原理就是氢原子核在磁场中自旋运动时所具有的量子力学特性。在一个均匀磁场B0中,氢原子核的…

Linux网络配置的相关文件

(1)etc/resolv.conf: resolv.conf文件是Linux系统中的一个配置文件,用于指定DNS服务器的地址。当在系统中进行网络访问时,需要将主机名解析为IP地址。resolv.conf文件中包含了DNS服务器的地址、搜索域名等信息,用于帮助系统进行主机名解析。…

5FE卡轨式百兆非网管工业以太网交换机二层非网管全百兆工业级交换机

HY5700-4505F系列是一款5口百兆非网管工业以太网交换机,支持5个10Base-T/100Base-TX电口。外壳使用铝合金型材,使产品轻巧、坚固、耐腐蚀、抗电磁干扰能力更强,可以在-40℃-85℃的极端环境温度中正常工作,满足了不同工业应用要求&…

4光12电千兆网管型工业以太网交换机 16口二层导轨式可管理工业以太网交换机

HY5700-75412G-X千兆网管型工业以太网交换机专为严苛关键应用环境设计,如工厂自动化、智能交通及过程控制等领域。4个千兆光纤端口有大的灵活性,可轻松建立千兆冗余环及进行千兆上传。HY5700-75412G-X配备了12个千兆以太网端口和4个千兆SFP光模块插槽&am…

千兆2光8电管理型工业以太网交换机WEB管理X-Ring一键环网交换机

HY5700-7528G-X系列交换机是汉源高科推出的新一代绿色节能管理型千兆以太网接入工业交换机,支持ERPS环网,用以搭建高可用的,安全可靠的工业接入网。可广泛应用于智慧城市,智慧交通,智慧管廊,智慧工业等以太…

2千兆光+6千兆电导轨式网管型工业级以太网交换机支持X-Ring冗余环网一键环网交换机

HY5700-7526G-X工业级以太网交换机具有6个10/100/1000M自适应RJ45接口和2个1000M标准SFP光口。DIN导轨式安装,12~54V宽电压输入,并提供过载和反接保护,强抗电磁干扰能力,完全满足苛刻的工业应用环境,为工业…