我正在学习如何在Python脚本中使用DJI SDK来分析热成像图的内容(辐射JPG、R-JPG)。
根据文档,使用“测量”选项调用 SKD 应生成“像素类型为 INT16 或 FLOAT32 的全局温度值图像。”
.\dji_irp.exe -s .\DJI_blablabla.JPG -a measure -o measure.raw
我已经这样做了,它生成了一个我可以用 Python 读取的二进制文件。该文件包含一个长度为 655360 个元素的整数值列表。值似乎成对出现:奇数位置的值范围为 1 到 252,而偶数位置的值可以是 1 o 0。
temps = subprocess.call(['./dji_irp.exe', '-s', path_file, '-a', 'measure', '-o', 'measure.raw'])
with open('measure.raw', 'rb') as f:
file_contents = f.read()
byte_array = np.frombuffer(file_contents, dtype=np.uint8)
print(len(byte_array))
#655360
print(byte_array[:10])
#[69 1 69 1 69 1 78 1 73 1]
当分成两个数组并重新整形为 640x512 时,它们看起来像这样:
print(byte_array[0:40:2])
# [ 69 69 69 78 73 78 73 65 51 56 65 65 65 69 69 65 61 29 233 178]
print(max(byte_array[0::2]))
# 252
print(min(byte_array[0::2]))
# 1
plt.imshow(byte_array[0::2].reshape((512, 640)), cmap='magma')
print(byte_array[1:40:2])
# [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0]
print(max(byte_array[1::2]))
# 1
print(min(byte_array[1::2]))
#0
plt.imshow(byte_array[1::2].reshape((512, 640)))
第二张图像看起来像第一张图像的掩模,但我不知道如何解释第一张图像的值,因为这些值对我来说看起来不像温度,甚至不是华氏度。
根据我对捆绑的自述文件和文档的理解 - 您使用的
dji_irp.exe
是捆绑的示例代码,您使用的测量功能仅用于输出图像,而不用于实际测量。您必须编写自定义代码才能完成您想要完成的任务。
我找到了 这个 Python 库,您可以包含并让它从 SDK 中的
utility\bin\windows\release_x64
获取 DLL,然后在您的 Python 代码中公开 SDK 函数。否则,您必须遵循 SDK 捆绑的自述文件的说明来编写您自己的 C 代码:
无论哪种方式,您正在寻找的功能都是
dirp_measure_ex
,文档将其描述为执行以下操作:
使用 R-JPEG 格式的 RAW 数据测量整个热图像的温度。每个 FLOAT32 像素值代表真实的摄氏温度。