lepton_get_object_high_temp.py
# Эта работа лицензирована по лицензии MIT.
# Copyright (c) 2013-2023 OpenMV LLC. All rights reserved.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Пример получения высокой температуры объекта с Lepton
#
# В этом примере показано, как получить температуру объекта с помощью отслеживания цвета.
# Отключив AGC и задав максимальный и минимальный диапазон температуры, можно превратить lepton в
# отличный датчик для обнаружения объектов определённой температуры. При этом FLIR Lepton -
# это микроболометр, а не термопара. Поэтому ему нужно часто перекалиброваться (это называется
# коррекция плоского поля - FFC). Кроме того, микроболометрическим устройствам требуется поддержка обработки
# на борту для компенсации эффектов температурного дрейфа, что называется поддержкой радиометрии.
# Примечание о затворе FLIR Lepton: FLIR Lepton с радиометрией и затвором будут часто приостанавливать видео,
# нагреваясь для перекалибровки. Это будет происходить всё реже по мере того, как температура датчика
# стабилизируется. Вы можете принудительно отключить перекалибровку через API lepton, если это нужно.
# Однако это не рекомендуется, поскольку качество изображения со временем ухудшится.
# Если вы используете LEPTON, отличный от Lepton 3.5, этот скрипт может работать не идеально, поскольку другие
# модели lepton не поддерживают радиометрию или не активируют процесс калибровки достаточно
# часто, чтобы компенсировать изменения температуры (FLIR 2.5).
import csi
import time
# Пороги отслеживания цвета (Grayscale Min, Grayscale Max)
threshold_list = [(100, 255)] # отслеживание очень горячих объектов
# Задайте здесь целевой диапазон температуры
# 500C - это максимальная температура, которую может измерить датчик Lepton 3.5
# При комнатной температуре его максимум составляет ~380C
min_temp_in_celsius = 0.0
max_temp_in_celsius = 400.0
# Инициализация датчика.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize(csi.QQVGA)
# Включить режим измерения с высокой температурой
csi0.ioctl(csi.IOCTL_LEPTON_SET_MODE, True, True)
csi0.ioctl(csi.IOCTL_LEPTON_SET_RANGE, min_temp_in_celsius, max_temp_in_celsius)
# Пропустить кадры
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)))
# Функцией "find_blobs" ниже возвращаются только блобы, у которых пикселей больше, чем "pixel_threshold", и площадь больше, чем "area_threshold".
# Измените "pixels_threshold" и "area_threshold", если вы изменяете
# разрешение камеры. "merge=True" объединяет все перекрывающиеся блобы на изображении.
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))
)