lepton_get_object_temp_lcd.py
# Ce travail est publié sous licence MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Tous droits réservés.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Exemple d'obtention de la température d'un objet avec le Lepton
#
# Cet exemple présente comment obtenir la température d'un objet à l'aide du suivi de couleur.
# En désactivant l'AGC et en définissant une plage de température min et max, vous pouvez transformer le lepton en
# un excellent capteur pour repérer des objets d'une température particulière. Cela dit, le FLIR Lepton est un
# microbolomètre et non un thermopile. Il doit donc se recalibrer souvent (ce qui s'appelle
# la correction de champ plat - FFC). De plus, les appareils à microbolomètre nécessitent un traitement
# embarqué pour gérer les effets de la dérive thermique, appelé prise en charge radiométrique.
# Remarque sur l'obturateur du FLIR Lepton : les FLIR Lepton dotés de radiométrie et d'un obturateur mettront souvent la vidéo en pause
# lorsqu'ils chauffent pour se recalibrer. Cela se produira de moins en moins souvent à mesure que la température du capteur
# se stabilise. Vous pouvez forcer la recalibration à ne pas se produire si nécessaire via l'API du lepton.
# Cependant, ce n'est pas recommandé car l'image se dégradera avec le temps.
# Si vous utilisez un LEPTON autre que le Lepton 3.5, ce script pourrait ne pas fonctionner parfaitement car les autres
# leptons ne disposent pas de prise en charge radiométrique ou n'activent pas leur processus de calibration
# assez souvent pour gérer les changements de température (FLIR 2.5).
import csi
import time
import display
# Seuils de suivi de couleur (Min niveaux de gris, Max niveaux de gris)
threshold_list = [(200, 255)]
# Définir ici la plage de température cible
min_temp_in_celsius = 20.0
max_temp_in_celsius = 40.0
# Initialiser le capteur.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize((128, 160))
# Activer le mode mesure
csi0.ioctl(csi.IOCTL_LEPTON_SET_MODE, True)
csi0.ioctl(csi.IOCTL_LEPTON_SET_RANGE, min_temp_in_celsius, max_temp_in_celsius)
# Passer des images
csi0.snapshot(time=5000)
clock = time.clock()
lcd = display.SPIDisplay()
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)))
# Seuls les blobs comptant plus de pixels que "pixel_threshold" et plus de surface que "area_threshold" sont
# renvoyés par "find_blobs" ci-dessous. Modifiez "pixels_threshold" et "area_threshold" si vous changez la
# résolution de la caméra. "merge=True" fusionne tous les blobs qui se chevauchent dans l'image.
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))
lcd.write(img)
print(
"FPS %f - Lepton Temp: %f C"
% (clock.fps(), csi0.ioctl(csi.IOCTL_LEPTON_GET_FPA_TEMP))
)