# 基于OrangePi_Mlx90640_Python的热像仪项目(+网络监控和摄像) **Repository Path**: ret2nuh/Thermal-Imager_with_Network-Monitoring_base_on_OrangePi_Mlx90640_Python ## Basic Information - **Project Name**: 基于OrangePi_Mlx90640_Python的热像仪项目(+网络监控和摄像) - **Description**: 基于OrangePi、Mlx90640、Python的热像仪项目(带网络监控和摄像头) - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-17 - **Last Updated**: 2025-09-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: 热成像, Python, Linux, mlx90640, Flask ## README # 基于OrangePi_Mlx90640_Python的热像仪项目(带网络监控和摄像头) - 项目目的:学习了解linux、python和其他一些软硬件,边学边做; - 视频链接(有比较详细的过程和介绍,可以看看):https://www.bilibili.com/video/BV1YYnozSEDr ![输入图片说明](Thermal_mlx90640/%E5%9B%BE%E7%89%87/DSC_7014.jpg) ![输入图片说明](Thermal_mlx90640/%E5%9B%BE%E7%89%87/DSC_7009.jpg) ![输入图片说明](Thermal_mlx90640/%E5%9B%BE%E7%89%87/DSC_7034.jpg) #### 软硬件: **主要硬件:** - Orange Pi Zero 2w(全志H618、1GB LPDDR4、wifi、hdmi、usb、TF卡...) - 3.5寸(480x320)屏幕,分辨率设置为720x480,自带hdmi和触摸驱动 - 拆的一个旧的usb摄像头 - 咸鱼二手自拆的mlx90640热传感器(32x24阵列) - 串口模块(前期调试,之后使用ssh) - PCB主要电路(嘉立创打板):电源电路、usb拓展坞、mlx90640电路等 - 3D打印底板:电池固定 **系统:** - Orangepizero2w_1.0.2_ubuntu_jammy_desktop_xfce_linux6.1.31 **开发环境:** - Ubuntu24.1、VsCode、MobaXterm (windows上使用MobaXterm通过串口或者ssh连接操作开发板;VMWare虚拟机上的Ubuntu(VsCode)编写代码和调试;开发板和Ubuntu通过scp命令传输文件;) **开发语言:** - 主程序 Python、mlx90640驱动 C语言,通过.so文件链接 --- #### 功能: 测试时(1280x720),成品(720x480) - 摄像头模式:视频监控,清晰不卡顿无延时; - 热像仪模式:通过插值扩大分辨率显示热力图,支持多种热力图显示方案,显示最低温和最高温并标注位置; - 叠加模式:摄像头和热像仪画面叠加,查看更直观(仅中心对齐,近距离测量时偏差在可接受范围内); - 网络远程访问模式(Flask框架)(8000端口):通过浏览器远程查看画面并具有和本地一样的操控功能,画面清晰无卡顿无延时; - 截屏功能; - Led照明; - 触控屏或键盘或鼠标操控; - 使用mjpg-streamer网络监控(8080端口); - 无需重启,不同模式之间可多次反复切换; --- #### 存在问题: 1. 热力图帧速率不高; 2. 键盘事件响应在远程环境下失效,如使用MobaXterm远程登录,键盘命令无法被tkinter捕获; 3. 代码写得不太规范; 4. 系统启动比较慢(主要做的应用层工作,底层未涉及,系统功能未裁剪); ![输入图片说明](Thermal_mlx90640/%E5%9B%BE%E7%89%87/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE(3320).png) --- #### 程序框图: ![输入图片说明](Thermal_mlx90640/%E5%9B%BE%E7%89%87/2025831-210944.jpg) #### 代码结构与核心模块解析: 代码基础框架和图像处理基于项目:https://oshwhub.com/qzc13457/ovs_lite,感谢作者的分享 #### **1. 依赖库说明** 代码使用了多个第三方库,核心库功能如下: - `tkinter`:构建本地 GUI 界面; - `cv2`(OpenCV):处理摄像头视频流; - `PIL`(Pillow):图像格式转换、绘制文字 / 热图; - `matplotlib`:生成热成像颜色映射(colormap); - `numpy`:矩阵处理; - `multiprocessing`/`threading`:多进程 / 线程处理并发任务(如热成像数据采集、网络服务); - `subprocess`:启动外部程序(`mjpg-streamer`); - `Flask`:构建 Web 服务,提供远程访问接口; - `wiringpi`:控制 GPIO 引脚(如 LED); - `ctypes`:调用 C 语言驱动库(`mlx90640`传感器驱动); #### **2. 核心类与功能** ##### **(1)StreamManager 类:管理网络摄像头流(mjpg-streamer)** - 作用:启动 / 停止`mjpg-streamer`进程,提供网络摄像头流服务 - 关键方法: - `start_stream()`:设置好参数后通过`subprocess`启动`mjpg-streamer`; - `stop_stream()`:终止`mjpg-streamer`进程,释放资源; ##### **(2)Flask Web 服务:远程监视与操控** - 作用:通过 HTTP 接口提供远程访问,支持网页端控制设备 - 核心路由: - `/`:返回监控网页(`index1.html`); - `/video_feed`:生成 MJPEG 视频流,供网页实时显示; - `/save`/`/Led`/`/colormap`等:调用`ThermalImagingApp`的方法,实现截图保存、LED 亮灭、热力图切换等功能; - `/Thermal`/`/Camera`/`/overlay`:切换热成像模式、摄像头模式、叠加模式; - `/exit`:关闭 Flask 服务; ##### **(3)ThermalImagingApp 类:主应用核心** - 作用:整合 GUI 界面、摄像头控制、热成像数据处理、模式切换等功能; - - **GUI**:左侧控制面板:包含 10 个功能按钮,已绑定键盘快捷键(如c切换摄像头模式,t切换热成像模式);右侧显示区域:显示摄像头 / 热成像画面; - **热成像数据采集**:通过多进程`mlx90640_process()`调用`libGetTemp.so`驱动库(`mlx90640`传感器驱动),采集温度数据到共享数组`mlx90640_matrix`; - **热图生成与叠加**:`update_camera()`将温度数据转换为热图,通过透明度调整,叠加到摄像头画面,标记最高 / 最低温度位置及数值,显示画面刷新率(FPS); #### **3. 多进程与多线程设计** - **热成像数据采集**:通过`multiprocessing.Process`启动独立进程,避免阻塞 GUI 主线程; - **Flask 服务**:通过`threading.Thread`启动 Web 服务,实现本地 GUI 与远程访问的并发; - **共享数据**:使用`multiprocessing.Array`(`mlx90640_matrix`)和`Lock`实现多进程间的温度数据同步; --- #### 前期调试: ![输入图片说明](Thermal_mlx90640/%E5%9B%BE%E7%89%87/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250831140940.jpg) ![输入图片说明](Thermal_mlx90640/%E5%9B%BE%E7%89%87/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250831140857.jpg) #### 最终测试: ![输入图片说明](Thermal_mlx90640/%E5%9B%BE%E7%89%87/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE(3321).png) --- #### 杂记: - **编译.so文件**: - 依赖:libi2c-dev - 权限配置: sudo usermod -aG i2c $USER newgrp i2c - 所需文件: Get_Temperature.c、MLX90640_API.c、MLX90640_API.h、MLX90640_LINUX_I2C_Driver.c、MLX90640_LINUX_I2C_Driver.h - 命令: gcc Get_Temperature.c MLX90640_API.c MLX90640_LINUX_I2C_Driver.c -li2c -fPIC -shared -o libGetTemp.so - 虚拟机usb兼容性默认2.0,改为3.1,否则linux可能打不开摄像头,导致我一直以为是程序写错了; - 开发板hdmi图像输出到屏幕:export DISPLAY=:0 - 编写程序时需要填对应的摄像头usb口和I2C口; - 文件路径和代码中的一些路径修改; - TF卡烧录镜像成功,但系统运行老是各种报错,可能是TF损坏了,换一张; - 库和依赖有时候各种报错,没办法,网上找找解决办法吧; - MobaXterm命令长不换行问题:https://blog.csdn.net/zrzStudying/article/details/127814672 - mlx90640买的二手,便宜一些,但当无法输出温度的时候很容易怀疑是不是坏的,而且拆完发现管脚太短了(拆的过程也不顺利),前前后后费了不少功夫,有时候还是花钱省事,减小调试难度; - 所需接口数据线提前备好; - 注意摄像头和热传感器图像方向一致; - 开始前需要添加一个python 32位环境,不然编译出的64位程序无法在32位开发板运行; - 电路板上ams1117输出电流不够,系统经常重启,改为lm2596后正常工作;