-1

我正在使用来自 github 的现有脚本来计算 flir 相机的像素温度。可以在此处找到原始项目https://github.com/Nervengift/read_thermal.py/blob/master/flir_image_extractor.py我正在尝试自动化脚本以针对给定文件夹中的所有图像运行。该脚本适用于大多数文件,但我不时遇到问题,导致脚本中断。我得到的官方错误是这样的:

Traceback (most recent call last):
  File ".\flir_image_extractor.py", line 288, in <module>
    fie.process_image(args.input)
  File ".\flir_image_extractor.py", line 63, in process_image
    self.thermal_image_np = self.extract_thermal_image()
  File ".\flir_image_extractor.py", line 150, in extract_thermal_image
    thermal_np = raw2tempfunc(thermal_np)
  File "C:\Users\sai.peri\AppData\Local\Programs\Python\Python37-32\lib\site-packages\numpy\lib\function_base.py", line 2091, in __call__
    return self._vectorize_call(func=func, args=vargs)
  File "C:\Users\sai.peri\AppData\Local\Programs\Python\Python37-32\lib\site-packages\numpy\lib\function_base.py", line 2167, in _vectorize_call
    outputs = ufunc(*inputs)
  File ".\flir_image_extractor.py", line 149, in <lambda>
    PO=meta['PlanckO'], PR2=meta['PlanckR2']))
  File ".\flir_image_extractor.py", line 196, in raw2temp
    print("PB: {} LOG: {}".format(PB, log(PR1 / (PR2 * (raw_obj + PO)) + PF) - 273.15))
ValueError: math domain error

在跟踪之后,我添加了变量以打印出 PB 和 log 函数,因为这些是用于计算温度的(计算温度的线是这样的,temp_celcius = PB / log(PR1 / (PR2 * (raw_obj + PO)) + PF) - 273.15我正在使用平均值,所以我可以选择忽略一些像素(尽管这会对我的结果有影响,虽然可能很小)。我已经打印出 PB 和 LOG 的值,直到出现异常:

PB: 1428 LOG: -263.82261856683573
PB: 1428 LOG: -260.9464780172497
PB: 1428 LOG: -262.7915360578767
PB: 1428 LOG: -262.7915360578767
PB: 1428 LOG: -263.09963560725936
PB: 1428 LOG: -262.7915360578767
PB: 1428 LOG: -262.90511447579644
PB: 1428 LOG: -261.8717079609195

我假设最后一个条目是最后一个成功的计算,而在下一个它失败了。到底发生了什么,我该如何解决这个问题以保留实际的合法价值?我曾尝试联系该项目的所有者,但没有成功。我要提前感谢您的帮助。

编辑:我已经打印出进入日志函数的变量的值。有了这些值,我去了 wolfram alpha 并得出了 -273.39416898307 的值,因此计算结果变为 1428/-273.39416898307 = -5.223227 作为实际温度值。我不确定为什么会出现此错误,因为所有先前的 LOG 函数在 -273 减法时都是负数。用于导致错误的值以及我用 wolfram 检查的值是这样的:PB: 1428 PR1: 17096.453 PR2: 0.062614508 raw_obj + PO: -1260325.936342655 PF: 1使用等式:temp_celcius = PB / log(PR1 / (PR2 * (raw_obj + PO)) + PF) - 273.15

4

1 回答 1

0

log()产生此错误的是 Python操作。您必须显示调用它时使用的所有变量以发现发生了什么。

但是很容易重现:

In [2]: import math

In [3]: print math.log(0)
--------------------------------------------------------------------------- ValueError                                Traceback (most recent call last) <ipython-input-3-84ea89d877e8> in <module>()
----> 1 print math.log(0)

ValueError: math domain error

请记住,您并不需要0与处理浮点数完全一样。任何“太小”的值都会产生同样的问题:

In [11]: print math.log(1e-1000)
--------------------------------------------------------------------------- ValueError                                Traceback (most recent call last) <ipython-input-11-7cab888e1f4d> in <module>()
----> 1 print math.log(1e-1000)

ValueError: math domain error

任何负值也会产生相同的后果。

使用 values PB: 1428 PR1: 17096.453 PR2: 0.062614508 raw_obj + PO: -1260325.936342655 PF: 1log()调用作为结果0.783355249302提供的 。-0.244168983072所以你的问题在别处。

于 2019-09-06T20:06:15.303 回答