Pull to refresh
50
0

User

Send message
Сложно сказать. Почитай hackaday.io/project/159615-lepton-35-thermal-imaging-camera/log/149651-lepton-agc
Да и вообще весь лог проекта hackaday.io/project/159615/logs человек свой тепловизор собрал. Тут репозитарий github.com/danjulio, много полезного кода, особенно вот github.com/danjulio/firecam/blob/master/firmware/components/lepton/lepton_utilities.c где как раз пересчет по вашей формуле.
Правда не знаю зачем он так заморочился. Я себе заказал тач дисплей под raspberry 3, подключу через USB будет самодельный тепловизор. А дальше сохранять в jpeg и можно открывать через Flir Tools.
Тут больше вопрос финансов, а не детей. Думаю выкроить пару неделек для себя любимого всегда можно без особых проблем.
Если финансы позволяют, есть очень много коротких, но хорошо организованных и насыщенных туров. Та даже если не позволяют, есть куча бюджетных вариантов. Было бы желание.
Посмотрите вот сюда. cdn.sparkfun.com/assets/e/9/6/0/f/EngineeringDatasheet-16465-FLiR_Lepton_8760_-_Thermal_Imaging_Module.pdf
Это даташит к моему модулю www.sparkfun.com/products/16465

Особенно обратить внимание на вот это:
Radiometry enabled, TLinear enabled (default for Lepton 2.5 and 3.5)
• Radiometry enabled, TLinear disabled
• Radiometry disabled
3.5.1 Radiometry Enabled — TLinear
The radiometry enabled mode affects the transfer function between incident flux (scene temperature) and pixel
output. From an image-quality standpoint, both radiometry modes produce nearly identical performance (no
change in NEDT), and either mode is appropriate for strict imaging applications. However, for applications in
which temperature measurement is required, radiometry must be enabled to access the related calibration and
software features, such as TLinear and Spotmeter, which support these measurements. In radiometry enabled
mode, enabling the corresponding TLinear mode changes the pixel output from representing scene flux in 14-bit
digital counts to representing scene temperature values in Kelvin (multiplied by a scale factor to include
decimals). For example, with TLinear mode enabled with a resolution of 0.01, a pixel value of 30000 signifies that
the pixel is measuring 26.85°C (300.00K – 273.15K). The Lepton with Radiometry configuration is intended as a
fully radiometric camera; therefore, the factory defaults are defined to have both radiometry and TLinear modes
enabled.



Хочу заметить, что это все касается самого термомодуля, а не его обвязки под USB/SPI.

А вот тут упоминается ваша формула cdn.sparkfun.com/assets/d/4/d/6/c/Getting-Started-Guide-16465-FLiR_Lepton_8760_-_Thermal_Imaging_Module.pdf при работе в режиме с выключенным TLinear.

Так понимаю в некоторых версиях этот режим включен по дефолту и в RAW уже отдается непосредственно преобразованная температура.
Сомневаюсь что тот контроллер что-то там конвертирует, кроме как поддержку USB.
Вот, например, питоновский модуль для работы с лептоном по SPI github.com/groupgets/pylepton

Там такой же код:
image = capture(flip_v = False, device ="/dev/spidev0.0")
  cv2.imwrite(args[0], image)


по идее можно также делать…

numpy_array = short_array_to_numpy(height, width, image)

и дальше numpy_array[x][y] получаем значения градусов в конкретной точке в кельвинах. Можно проверить взяв любой jpeg с тепловизора, снятого по SPI.
Сам себе «начальство». При чем часто «оно» еще более требовательное, ибо сложно равняться на коллег. Так что выгорают еще жестче.
Ну что значит не напрямую. Я использую вот такую обвязку www.sparkfun.com/products/14670, она же умеет и в SPI. Принципиальной разницы как получать RAW через SPI или usb нету, данные одинаковые. Там, кстати, питновские примеры из api как раз под SPI все, я переделывал под USB. Принципиально там отличие только пару строчек получения картинки с камеры, остальной код будет тот же.
Там их обвязок куча разных, можно хоть к камере подпаяться, мне просто через USB удобнее.
Я не знаю как от модели к модели, но моя отдает сразу матрицу со значениями температур. Вроде в прошлых версиях было иначе, но мой модуль от Flir One Pro версии Lepton 3.5.
Вот мой рабочий код, который снимает картинку и выводит значения температур для каждого 15 пикселя, если он выше 30 градусов.
Получение изображения с модуля lepton через USB с преобразованием температур
import clr # needs the "pythonnet" package
import sys
import os
import time
import platform
import time
import numpy
from matplotlib import pyplot as plt
from collections import deque
from matplotlib import cm

clr.AddReference("LeptonUVC")
clr.AddReference("ManagedIR16Filters")
from Lepton import CCI
from IR16Filters import IR16Capture, NewIR16FrameEvent, NewBytesFrameEvent

def short_array_to_numpy(height, width, frame):
    return numpy.fromiter(frame, dtype="uint16").reshape(height, width)
def centikelvin_to_celsius(t):
    return (t - 27315) / 100

found_device = None
for device in CCI.GetDevices():
    if device.Name.startswith("PureThermal"):
        found_device = device
        break

if not found_device:
    sys.exit("Couldn't find lepton/ device")
else:
    lep = found_device.Open()
#print(lep.oem.GetSoftwareVersion())
#print(lep.sys.GetCameraUpTime())
lep.sys.RunFFCNormalization()
capture = None

def show_ir_frame(net_array, width, height):
    numpy_array = short_array_to_numpy(height, width, net_array)
    plt.clf()
    for y in range(height):
        for x in range(width):
            raw_temp = numpy_array[y][x]
            temp_cel = centikelvin_to_celsius(raw_temp)
            if y % 15 == 0 and x % 15 == 0:
                if temp_cel > 30:
                    plt.text(x + 1, y + 1, str(temp_cel), va='center', ha='center')
                    #print(str(temp_cel)+" ", end = '')
    raw_max = numpy_array.max()
    max_temp = centikelvin_to_celsius(raw_max)
    print(max_temp)
    plt.imshow(numpy_array, cmap=cm.plasma)
    plt.imsave('outfile.jpg',numpy_array)
    plt.show(block=False)
    plt.pause(10)

incoming_frames = deque(maxlen=10)
def got_a_frame(short_array, width, height):
    incoming_frames.append((height, width, short_array))
capture = IR16Capture()
capture.SetupGraphWithBytesCallback(NewBytesFrameEvent(got_a_frame))
capture.RunGraph()

while True:
    if len(incoming_frames) > 0:
        height, width, net_array = incoming_frames[-1]
        show_ir_frame(net_array, width, height)

Файлы которые должны быть в корне скрипта (взять из Lepton CCI SDK)
LeptonUVC.dll
LeptonUVC.xml
ManagedIR16Filters.dll
TIFFfile.dll

Правда как делать калибровку и добиться точности как в статье, я пока не придумал. Из чего сделать эталон. Сейчас у меня она на моей морде лица плавает +- 1-3 градуса.

Кстати пробовал скармливать вывод с лептона нейросети, думал оно распознает лицо и через какой-то dlib ловить то самое место в уголке глаза, но они не понимают тепловой профиль. Надо или переобучать сеть на тепловизионные снимки или получать изображение еще обычной камерой и совмещать.
Читал, однако в данной статье используются несколько иные методы (имхо более простые). Потому и интересно как они добились такой точности.
Термин «выгорание» это не про недельный отпуск, это гораздо более серьезная проблема и так она не решается. Это больше больше к диагнозу Астения.
По себе знаю, что это такое. В один момент пришлось уйти и не вернуться. Не смотря на все перспективы и заработки. Хорошо что подушка многолетняя, была бы она на месяц-два даже не знаю, что бы делал.
Но ни о чем не жалею. Здоровье оно важнее.
К слову, мой совет, отдых с коктейлем у моря/океана от выгорания не спасёт. А вот жесткое глубокое погружение в нетуристическую среду, в идеале иной культуры (Азия, например), отлично помогает сделать перезагрузку. Сюда же всякие нестандартные походы, полеты, плавания… Главное чтобы мозг не переставал офигевать от новых видов, вкусов, запахов, ощущений.
Интересно, но много общей информации и ни какой технической конкретики. Например какие модули используются для определения температуры.
К слову, сейчас для себя открыл вот такой набор тепловизионной камеры:
www.sparkfun.com/products/14670 + www.sparkfun.com/products/16465 (у китайцев дешевле)
У меня банально сломался тепловизор Flir One Pro, и я вытащил из него модуль, докупил плату управления и получил возможность программно снимать картинку с тепловизионной камеры.
Сейчас делаю just for fun определение температуры людей в поле зрения тепловизионной камеры, и вот интересно было бы почитать как на практике происходит калибровка и достигается такая точность измерений.

В точку! Так и есть. При чем, скажу больше, Андроид и iPad версии отличаются, и значительно. Вообще ни когда не понимал, почему такая корпорация не может сделать нормальное, универсальное приложение. Добавить функций, например поиск по комментариям, их перевод.
Мне казалось, что это давно экономически нецелесообразно. Проще хард за те же деньги купить. Быстрее и, как мне кажется, все же надежнее.
Кстати для mega.nz есть под питон удобная библиотека для заливки. Я вот буквально на днях на ней настроил заливку бакапов на бесплатные аккаунты. В фришные 50 Гб у меня помещается ежедневный бакап за 2 недели. Потом циклично удаляются все старые файлы.
Вообще бесплатно, просто и универсально.

Вот мой код, мож кому пригодится.
mega_upload.py
import os,sys
from mega import Mega
from datetime import datetime
import logging

logging.basicConfig(stream=sys.stdout, level=logging.INFO)

if len(sys.argv) > 1:
    upload_path = sys.argv[1]
else:
    upload_path = "D:\\BAK\\test.txt"

upload_filename = os.path.basename(upload_path)
upload_filesize = os.stat(upload_path).st_size
file_exists = False
print("Uploading path: {} Size: {} ".format(upload_path, upload_filesize))
email = 'xxx@xxx.com'
password = '342143432'
mega = Mega()
m = mega.login(email, password)
details = m.get_user()
print(details)
files = m.get_files()
storage_space = m.get_storage_space()
print((m.get_quota()))
print(storage_space)

for file in files: #читаем список файлов и проверяем нет ли дубликатов, а также удаляем все файлы , залитые позже 14 дней назад
    if 's' in files[file]:
        file_size = files[file]['s']
        name = files[file]['a']['n']
        ts = files[file]['ts']
        day_diff = (datetime.now() - datetime.fromtimestamp(ts)).days
        print("File: {} Size: {}  Date: {} [{} days]".format(name, file_size, datetime.fromtimestamp(ts), day_diff,))
        if day_diff > 14:
            m.delete(file)
            print("       ******* ===> deleting file  "  + name)
        if upload_filename == name:
            file_exists = True
m.empty_trash() #очищаем корзину
if file_exists:
    print("*** ALREADY EXISTS:" + upload_filename)
else:
    free_space = storage_space['total']-storage_space['used']
    print("Total: {} Used: {}  Free: {}".format(storage_space['total'], storage_space['used'], free_space))
    if upload_filesize > free_space:
        print("NOT ENOUGH SPACE:" + name)
    else:
        print("ALL OK, UPLOADING ..." + upload_path)
        remote_filesize = 0
        upload_retry = 0
        while remote_filesize != upload_filesize and upload_retry < 2: #проверяем , залился ли файл и совпадает ли размер
            try:
                res = m.upload(filename=upload_path, dest_filename=upload_filename)
                if 'f' in res:
                    if len(res['f']) > 0:
                        if 's' in res['f'][0]:
                            remote_filesize = res['f'][0]['s']
            except:
                print("upload error! path: "+upload_path+" name: "+upload_filename)
            upload_retry += 1
print("Done")


Ну и батник запуска
set MYDATE=%date%
"C:\Program Files\7-Zip\"7z.exe a -xr@exclude.txt -ssw -pMyPassword D:\BAK\1C\1C8_%MYDATE%.7z E:\DATA\1C
"C:\Program Files (x86)\Python"\python.exe mega_upload.py D:\BAK\1C\1C8_%MYDATE%.7z

в файл exclude.txt запихиваем в столбик ненужные расширения, например *.zip

прописываем его в планировщик и имеем простой, ежедневный бакап папки в бесплатное облако
У нас, например, Western Digital My Cloud Home 4TB стоит около 200 долл, а ценник на 4TB 2.5 " около 150 долл. Но эти вещи решают разные задачи. Смотря что нужно — раз в год скопировать данные и закинуть их в безопасное место или иметь постоянный доступ для ежедненвного бакапа.
Доступ извне, к слову, работает так себе. Прога для заливки, что под андроид, работает коряво. Нету ни какой информативности о том, что происходит и что оно там делает. Думал из отпуска заливать фотки с телефона, но не тут то было, по сути бестолковая вещь. Но может не разобрался до конца. Проплатил нормальное облако от гугла.
Есть бюджено-дешевый My WD cloud. Стоит по цене чуть дороже харда того же объема, зато своё облако из коробки с возможностью доступа извне.
А будучи подключенным к сети, обеспечивает скорость около 80 МБ/сек.

Собственно человеческий мозг сработает также. В зависимости от полученного опыта, каждый увидит что-то своё.
Сложно требовать от компьютерного зрения результатов, лучше, чем человеческий мозг.
ага, ток я помню ничего не мог разобрать))) да и сейчас не особо разглядел. Интересно что там нейросеть рассмотрит.
Я использовал эту библиотеку github.com/abewley/sort
работала у меня и на PyTorch (Detectron2) и на TensorFlow (Mask_RCNN) для определения движущихся объектов на потоке с камеры.
Но спасибо за объяснение того, как оно реально работает. Полезно.
Раньше были обложки на тетрадки, где из шума надо было выделить изображение. Сначала фокусируешься на палец, а потом на изображение. Нечто похожее, но ни одного примера найти не могу. Неужели эти изображения канули в лета.
А какие есть варианты со своим собственным сервером? У Remote Utilities, как я понимаю, есть возможность использовать свой хост сервер, но серверная часть почему-то только под Windows

Information

Rating
Does not participate
Registered
Activity