站内搜索
发作品签到
双目手机热成像仪
专业版

双目手机热成像仪

简介

基于可见光和热成像传感器的双目手机热成像仪。

简介:基于可见光和热成像传感器的双目手机热成像仪。
星火计划2023

开源协议

MIT License

创建时间:2023-11-04 15:34:01更新时间:2024-02-03 22:53:25

描述

项目说明

可见光相机具有分辨率高、帧率高的特点,热成像传感器可以测量温度分布,但是分辨率低、帧率低,使用可见光图像来补偿热成像图像,从而可以得到质量较高的热量分布图。本体具有一个普通的可见光camera和一颗热成像传感器,经过MCU读取后通过USB接口传输到手机端,借助手机强大的算力支持来进行图像处理和融合,手机屏幕上显示最终图像

开源协议

MIT协议,被授权人有权利使用、复制、修改、合并、出版发行、散布、再授权及出售软件及软件的副本。 被授权人可根据程式的需要修改授权条款为适当的内容。 在软件和软件的所有副本中都必须包含版权声明和许可声明,但原作者不承担使用后的风险,也没有技术支持的义务

项目相关功能

本项目整体功能框架如下,MCU通过I2C接口读取热成像传感器数据,然后通过USB接口传向USB Hub,Camera为一个通用免驱USB摄像头,也接到USB Hub上面,Usb Hub和Android手机连接,在Android手机上有两个设备,一个是Camera,一个是热成像传感,在Android手机应用层获取到两个传感器数据,通过一定算法进行融合,得到分辨率较高、质量较好的热成像图
0bbeb99e6e164478a6a63b677a10c409.png

项目属性

本项目为首次公开,为本人原创项目。项目未曾在别的比赛中获奖。

项目进度

20231128

基本功能OK,完成度还需后续优化,已知问题如下:

  1. STM32 USB到SL2.1A的线路连反,工程中已修正
  2. 亮度过高的场景显示图像会过曝
  3. 屏幕旋转当前未适配,请关闭屏幕旋转

20240203

  1. 新增高低温跟踪、算法参数调整、融合模式切换、帧率切换功能
  2. 优化界面,修复一些bug,自动锁定屏幕旋转
  3. 新增3d打印外壳

设计原理

MCU

MCU使用STM32F411CEU6,带浮点运算单元可对热成像数据进行解算,带USB FS,最小系统电路如下
image.png

USB Hub

USB Hub使用SL2.1A,支持USB HS可以用于传输摄像头数据,根据手册此处接了晶振U3不需要焊接。USB1是一个USB TypeC公头,用于连接手机
image.png
Camera使用一块640x480的UVC摄像头子板,通过焊接方式连接到CAM_DM/CAM_DP

热成像传感器

热成像传感器使用MLX90640,分辨率32x24像素,I2C接口最高速率1MHz
image.png

电源

直接使用一块LDO进行稳压,型号是ME6211,该型号可以直接使用低ESR的陶瓷电容进行输入输出的稳压
image.png

其他

电源灯和测试LED
image.png
调试SWD接口
image.png
测试点,固件使用UART2作为Debug串口
image.png

软件说明

代码资源

分为单板固件、Android App和3d打印外壳三部分

单板固件

https://github.com/colourfate/thermal_bridge

Android App

https://github.com/colourfate/ThermalEyes

3d打印外壳

请在附件中下载 3d_printed_casing.zip 文件,提供step文件,stl文件可直接打印

单板固件

开发环境

目前使用STM32CubeIDE

软件流程

软件分为两部分组成:mlx90640驱动、热成像数据传输协议,总的来说软件流程就是通过I2C从mlx90640读取数据,然后进行打包,最后使用USB发送,整个过程使用一个循环即可,其中mlx90640的温度测量范围为-40到300摄氏度,保留两位小数转换为整型为-4000到30000,可以用16位整型覆盖
9f6a33be034a41c194fd5a74ff1d5c89.png

mlx90640驱动

mlx90640官方已经提供驱动,只需要实现对应I2C读写操作,即可通过API来读取传感器数据

数据协议

从传感器获取的数据需要通过USB发送,由于获取的温度为float型,实际需要精度仅需要小数点后两位即可,因此转换为整型可以节约带宽,mlx90640温度测量范围为-40到300摄氏度,可以用16位有符号整型,和上位机通信协议如下:

----------------------------------------------------------------------------
|  header  |  type  |  length  |  data[0]  |  data[1]  |  ...  |  data[n]  |
----------------------------------------------------------------------------
  • header:uint16_t,起始码,固定0x8000
  • type:uint16_t,表示数据类型
  • length:uint16_t,表示数据包长度,表示后续data数据包的个数
  • data:uint8_t数组,放实际数据

USB发送

USB库由CubeIDE自动生成,直接调用USBCDC发送数据即可

Android APP

这里有两个USB设备,一个是USB串口,用于传输热成像数据,一个USB摄像头,用于传输图像数据,Android端主要完成数据读取、融合和显示功能

软件框架

Camera和热成像传感器的数据读取都有对应的库支持,两个库对数据的读取都采用了异步回调的方式,因此这里采用双buffer缓存的机制,以Camera为例:

  1. 初始化一个长度为2的队列,当回调发生时,新申请一块buffer,将YUV数据拷贝到这块buffer中,然后将这块buffer放入队列
  2. 起一个线程,不断从队列中读取数据,用于数据融合
  3. 如果线程读取太慢,回调发现队列已经满,则从队列中取出一块buffer丢弃,然后再将新的buffer放入队列
  4. 如果回调一直不来,线程会发现队列为空,则跳过下一次再读取
  5. 因为每一次回调都会新申请一块buffer,因此buffer不存在并发问题
  6. 队列添加和删除访问的都是同一个数据结构,存在并发问题,操作时需要注意上锁
    如上所述,存在两个队列,一个存放YUV数据,一个存放热成像数据,通过一个线程来访问两个队列,当两个队列都有数据时才取出进行数据融合,综上所述,软件总体流程如下:
    Android热成像软件框架.png

Camera数据读取和预览

Android对摄像头的支持使用UVCAndroid,参考文章:https://blog.csdn.net/hanshiying007/article/details/124118486
该库基于saki4510t/UVCCamera开发,提供了更为简单的接口。预览和数据读取参考其中的CallbackDemo,需要重写其中的ICameraHelper.StateCallbackd,这里获取摄像头的数据然后将其放入YUV队列,格式为NV21

热成像数据读取和预览

3.2中所述热成像数据通过USBCDC传输,在Android端看到的是一个虚拟串口,Android开发环境中,使用felHR85/UsbSerial提供虚拟串口的操作支持,回调中将热成像数据放入队列中

数据融合

数据获取

使用一个线程来获取数据,这里预计相机帧率比热成像帧率更高,等待 mYUVQueue 队列有数据时才进行数据融合,当 mThermalQueue 没有数据时,使用上一帧的数据

融合算法

这里摄像头采集的是可见光的图像,分辨率是640x480,热成像采集的是温度分布,分辨率是32x24,融合算法的目的是通过参考可见光的图像,让热成像采集的温度图像拥有更多的细节。
融合算法第一步是从可见光相机中提取其中的高频信息,当前 Android 端APP集成了 OpenCV,之前的方法已没有使用,这里使用高斯模糊的方法提取高频信息,参考博客:使用OpenCV Mat对图片低频信息、高频信息提取及无损还原(高斯模糊、做差、求和)

Mat im_cam_l;
GaussianBlur(im_cam, im_cam_l, Size(11, 11), 5, 5);
Mat im_cam_h = im_cam - im_cam_l;

提取高频信息之后,再将其和插值放大后的热成像图像进行叠加,获得融合后的图像,最后再赋予伪彩色

Mat im_fusion = im_cam_h + im_them_scale;
applyColorMap(im_fusion, im_fusion_color, COLORMAP_JET);

仿真效果如下,其中第一张是camera拍的图片,第二张是热成像获取的温度分布经过插值放大后的图片,分辨率均为640x480
cam_test.jpg
therm_scale.jpg
首先对可见光相机进行高频信息提取,低频信息和高频信息分别如下
cam_l_test.jpg
cam_h_test.jpg
然后叠加上热成像图像,并赋予伪彩色,采用JET色彩表,结果如下
fusion_test.jpg

色彩映射

色彩映射是直接将热成像图像赋予伪彩色后,再按照YUV的方式叠加到可见光的图像中,由于可见光图像中本身包含大量的信息,相当于增加了热成像的信息量。色彩映射基本思想是将热成像的RGB分量按照公式换算为YUV分量,然后再各自减去128作为可见光图像的偏移量,叠加到可见光图像中,色彩映射效果如下
color_map.png

设计注意事项

1. U3磁珠仅作测试使用,不需要焊接!不需要焊接!不需要焊接!
2. STM32到SL2.1A的usb线连反,使用飞线修正后验证正常,工程中已修改,但时间太紧还未打样,不放心可以在版本控制中回退到release_1第一次打样版本,然后自行修正

image.png
3. 演示中板子打样厚度为1.2mm
4. camera的usb速率较高,打样时需要进行阻抗控制
5. camera子板参考此链接,连接线间距为0.8mm,参考此链接
image.png
image.png
6. mlx90640传感器较高,最好将camera子板垫高一点

实物展示

b站视频

以下是较为早期的版本

演示

https://www.bilibili.com/video/BV1M64y177ig

原理讲解

https://www.bilibili.com/video/BV1yb4y1T7hD

单板硬件

P31122-195021(1).png
1706934410245(1).png

拍摄效果

IMG_0093(1).png

色彩映射效果

S40203-12200636_com.example.thermaleyes(1).png

图像融合效果

S40203-12193689_com.example.thermaleyes(1).png

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
1
202311241743.mp4
903
2
202311241819.mp4
621
3
thermal_bridge-main.zip
1022
4
ThermalEyes-main.zip
567
5
3d_printed_casing.zip
369
克隆工程
添加到专辑
0
0
分享
侵权投诉
知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

底部导航