lepton_get_object_temp.py
# هذا العمل مرخص بموجب ترخيص MIT.
# حقوق النشر (c) 2013-2023 OpenMV LLC. جميع الحقوق محفوظة.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# مثال الحصول على درجة حرارة الجسم باستخدام Lepton
#
# يعرض هذا المثال كيفية الحصول على درجة حرارة جسم ما باستخدام تتبع اللون.
# من خلال إيقاف تشغيل AGC وتعيين نطاق درجة حرارة أقصى وأدنى، يمكنك تحويل Lepton إلى
# مستشعر رائع لرؤية الأجسام ذات درجة حرارة معينة. مع ذلك، فإن FLIR lepton هو
# microbolometer وليس thermophile. لذلك، يحتاج إلى إعادة معايرة نفسه بشكل متكرر (وهو ما يُسمى
# تصحيح المجال المسطح - FFC). بالإضافة إلى ذلك، تتطلب أجهزة microbolometer دعم معالجة
# على اللوحة للتعامل مع تأثيرات انحراف درجة الحرارة، وهو ما يُسمى دعم radiometry.
# ملاحظة حول غالق FLIR Lepton: ستقوم أجهزة FLIR Lepton المزودة بـ radiometry وغالق (shutter) بإيقاف الفيديو مؤقتاً بشكل متكرر
# أثناء تسخينها لإعادة المعايرة. سيحدث هذا بشكل أقل تدريجياً مع استقرار درجة حرارة المستشعر
# بمرور الوقت. يمكنك إجبار عدم حدوث إعادة المعايرة إذا لزم الأمر عبر واجهة برمجة lepton API.
# ومع ذلك، لا يُنصح بذلك لأن جودة الصورة ستتدهور بمرور الوقت.
# إذا كنت تستخدم LEPTON غير Lepton 3.5 فقد لا يعمل هذا البرنامج النصي بشكل مثالي لأن أجهزة
# lepton الأخرى لا تحتوي على دعم radiometry أو لا تقوم بتفعيل عملية المعايرة بشكل متكرر
# بما يكفي للتعامل مع تغيرات درجة الحرارة (FLIR 2.5).
import csi
import time
# عتبات تتبع اللون (الحد الأدنى لتدرج الرمادي، الحد الأقصى لتدرج الرمادي)
threshold_list = [(200, 255)]
# قم بتعيين نطاق درجة الحرارة المستهدف هنا
min_temp_in_celsius = 20.0
max_temp_in_celsius = 40.0
# تهيئة المستشعر.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize(csi.QQVGA)
# تفعيل وضع القياس
csi0.ioctl(csi.IOCTL_LEPTON_SET_MODE, 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)))
# فقط البقع (blobs) التي تحتوي على بكسلات أكثر من "pixel_threshold" ومساحة أكبر من "area_threshold"
# يتم إرجاعها بواسطة "find_blobs" أدناه. قم بتغيير "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))
)