在DJI SDK中测量原始图像的温度

问题描述 投票:0回答:1

我正在学习如何在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')

enter image description here

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)))

enter image description here

第二张图像看起来像第一张图像的掩模,但我不知道如何解释第一张图像的值,因为这些值对我来说看起来不像温度,甚至不是华氏度。

python image matplotlib dji-sdk
1个回答
1
投票

根据我对捆绑的自述文件和文档的理解 - 您使用的

dji_irp.exe
是捆绑的示例代码,您使用的测量功能仅用于输出图像,而不用于实际测量。您必须编写自定义代码才能完成您想要完成的任务。

我找到了 这个 Python 库,您可以包含并让它从 SDK 中的

utility\bin\windows\release_x64
获取 DLL,然后在您的 Python 代码中公开 SDK 函数。否则,您必须遵循 SDK 捆绑的自述文件的说明来编写您自己的 C 代码:

  • 项目配置:
    • /3rdparty/tsdk/include 添加到您的包含路径。
    • /3rdparty/tsdk/lib/ 链接到您的项目。
  • 源代码开发:
    • 包含 /3rdparty/tsdk/include/dirp_api.h 在你的源代码中。
    • 调用TSDK API进行红外图像处理
  • 使用 MSVC 或 GCC 构建项目。

无论哪种方式,您正在寻找的功能都是

dirp_measure_ex
,文档将其描述为执行以下操作:

使用 R-JPEG 格式的 RAW 数据测量整个热图像的温度。每个 FLOAT32 像素值代表真实的摄氏温度。

© www.soinside.com 2019 - 2024. All rights reserved.