lepton_get_object_temp.py
# Questo lavoro è concesso in licenza MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Tutti i diritti riservati.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Esempio di lettura della temperatura di un oggetto con Lepton
#
# Questo esempio mostra come ottenere la temperatura di un oggetto usando il tracciamento del colore.
# Disattivando l'AGC e impostando un intervallo di temperatura massima e minima puoi trasformare il lepton in
# un ottimo sensore per vedere oggetti a una particolare temperatura. Detto ciò, il FLIR lepton è un
# microbolometro e non un termopile. Quindi, ha bisogno di ricalibrarsi spesso (operazione chiamata
# flat-field-correction - FFC). Inoltre, i dispositivi microbolometrici richiedono supporto di elaborazione
# a bordo per gestire gli effetti della deriva termica, chiamato supporto alla radiometria.
# Nota sull'otturatore FLIR Lepton: i FLIR Lepton con radiometria e otturatore mettono spesso in pausa il video
# mentre si riscaldano per ricalibrarsi. Questo accadrà sempre meno frequentemente man mano che la temperatura del sensore
# si stabilizza. Se necessario, puoi impedire che la ricalibrazione avvenga tramite l'API del lepton.
# Tuttavia, non è consigliato perché l'immagine si degraderà nel tempo.
# Se stai usando un LEPTON diverso dal Lepton 3.5, questo script potrebbe non funzionare perfettamente poiché altri
# lepton non hanno supporto alla radiometria oppure non attivano il loro processo di calibrazione abbastanza
# spesso da gestire i cambiamenti di temperatura (FLIR 2.5).
import csi
import time
# Soglie di tracciamento colore (Grayscale Min, Grayscale Max)
threshold_list = [(200, 255)]
# Imposta qui l'intervallo di temperatura target
min_temp_in_celsius = 20.0
max_temp_in_celsius = 40.0
# Inizializza il sensore.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize(csi.QQVGA)
# Abilita la modalità di misurazione
csi0.ioctl(csi.IOCTL_LEPTON_SET_MODE, True)
csi0.ioctl(csi.IOCTL_LEPTON_SET_RANGE, min_temp_in_celsius, max_temp_in_celsius)
# Salta fotogrammi
csi0.snapshot(time=5000)
clock = time.clock()
print("Radiometry: " + "Yes" if csi0.ioctl(csi.IOCTL_LEPTON_GET_RADIOMETRY) else "No")
print("Resolution: %dx%d" % (csi0.ioctl(csi.IOCTL_LEPTON_GET_WIDTH), csi0.ioctl(csi.IOCTL_LEPTON_GET_HEIGHT)))
# Solo i blob con più pixel di "pixel_threshold" e più area di "area_threshold" vengono
# restituiti da "find_blobs" qui sotto. Modifica "pixels_threshold" e "area_threshold" se cambi la
# risoluzione della fotocamera. "merge=True" unisce tutti i blob sovrapposti nell'immagine.
def map_g_to_temp(g):
return ((g * (max_temp_in_celsius - min_temp_in_celsius)) / 255.0) + min_temp_in_celsius
while True:
clock.tick()
img = csi0.snapshot()
for blob in img.find_blobs(
threshold_list, pixels_threshold=200, area_threshold=200, merge=True
):
stats = img.get_statistics(thresholds=threshold_list, roi=blob.rect)
img.draw_detection(blob, label="%.2f C" % map_g_to_temp(stats.mean))
print(
"FPS %f - Lepton Temp: %f C"
% (clock.fps(), csi0.ioctl(csi.IOCTL_LEPTON_GET_FPA_TEMP))
)