怎样把mlx90640的输出显示为彩色的热成像图

2024-02-08 01:20

本文主要是介绍怎样把mlx90640的输出显示为彩色的热成像图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0、热成像图


如你所见,下图就是一张人手的热成像图,可以看作是显示手部温度分布的图像。


在这里插入图片描述


1、伪彩色图和RGB图

在文章如何使用STM32F10x驱动MLX90640模块(移植官方驱动)中,咱们的讨论了怎么用Melexis的官方驱动读取Mlx90640的数据,但是咋个显示呢?

实际上,这是个灰度图转伪彩色图的问题。不清楚伪彩色是啥的,可以参考伪彩色_百科

我们从Mlx90640读出数据以后用官方驱动中的API函数MLX90640_CalculateTo()解算得到一个温度矩阵,mlx9064032×24的热成像芯片,所以温度矩阵也就是32×24的,如下图所示(单位为℃)。


在这里插入图片描述
这是个一维的矩阵,而我们熟悉的RGB图像呢,需要R(红)、G(绿)、B(蓝)三个分量的数据,也就是说,RGB图像可以看做一个有三个维度的结构,如下图所示:
在这里插入图片描述
灰度图转化的RGB彩图,就是伪彩图。


这样,任务就转化成两个步骤

  • 把温度矩阵转化为一维的灰度矩阵;
  • 把灰度矩阵转化为三维的RGB三个分量组成的结构。

2、灰度值转RGB

明明是一个值,怎么转成三个值呢?映射。
这个映射关系不太好找吧,咱查查论文呗,已经有人说的很清楚啦。

具体可以参考这篇文章:A perceptive uniform pseudo-color coding method of SAR images
主要就看下面这张图:
在这里插入图片描述
也就是三个步骤:

  • 灰度矩阵中的最大值

  • 计算HSI

/* 计算HSI */
float I = grey,H = (2*PI*grey)/L;
float S;
/* grey < L/2 */
if(grey<L/2){S = 1.5 * grey;
}else{S = 1.5 * (L-grey);
}
  • 计算RGB
/* 计算RGB */
float V1 = S* cos(H);
float V2 = S* sin(H);
float R = I - 0.204*V1 + 0.612*V2;
float G = I - 0.204*V1 - 0.612*V2;
float B = I + 0.408*V1; 

3、温度转灰度

知道灰度和RGB之间怎么转化了,那怎么把温度转成灰度呢?放缩。
Mlx90640采集的最高温度为300度,把(0,300)放缩到(0,200),用下面这段代码就行啦

for(int i=0;i<size;i++){float grey = (temp[i]*255)/300;
}

4、Code

所谓Talk is free,咱闲话少说,直接上代码哈


  • 一个函数Temp2RGB(float* temp,int size,float maxTemp,uint16_t* rgb)
void Temp2RGB(float* temp,int size,float maxTemp,uint16_t* rgb)
{double miniNum = 0.0002;float L = maxTemp;float PI = 3.14;for(int i=0;i<size;i++){/* 转温度为灰度 */float grey = (temp[i]*255)/300;/* 计算HSI */float I = grey,H = (2*PI*grey)/L;float S;/* grey < L/2 */if((grey-L/2) < miniNum){//if(grey<L/2){S = 1.5 * grey;}else{S = 1.5 * (L-grey);}/* 计算RGB */float V1 = S* cos(H);float V2 = S* sin(H);float R = I - 0.204*V1 + 0.612*V2;float G = I - 0.204*V1 - 0.612*V2;float B = I + 0.408*V1; /* 转为16bits RGB[5-6-5]色彩 *//* (2^5-1)/(2^8-1) = 0.12 (2^6-1)/(2^8-1) = 0.24*/		uint16_t rbits = (R*0.125);uint16_t gbits = (G*0.250);uint16_t bbits = (B*0.125);rgb[i] = (rbits<<11)|(gbits<<5)|bbits;}}

函数有四个参数:
temp:温度矩阵转成的一维向量,就是从API函数MLX90640_CalculateTo()得到的数组
sizetemp的长度
maxTemptemp中的最大值
rgb:保存rgb值的数组


5、疑问

转换函数Temp2RGB(float* temp,int size,float maxTemp,uint16_t* rgb)的定义中有一段


uint16_t rbits = (R*0.125);
uint16_t gbits = (G*0.250);
uint16_t bbits = (B*0.125);
rgb[i] = (rbits<<11)|(gbits<<5)|bbits;

这是啥呢?我们得到RGB值之后为啥要把三个数转成一个uint16_t类型的数呢?
这是为了显示到彩色OLED屏幕上。


在这里插入图片描述


屏幕显示彩色当然有编码方式呀,就是用三个颜色的值编成一个数据,那编码方式是咋样的呢?看一下屏幕模块里芯片的数据手册哈。


在这里插入图片描述


可以看到色彩数据编码的长度最长为18位,不够三个完整的八位的数据拼接。我们选16位的编码方式,也就是五位用于R,中间六位用于G,右侧五位用于B,如下图所示

在这里插入图片描述


五位最多表示32个不同的数,六位最多表示64个不同的数,除以八位最大表示数255分别约等于0.1250.250,可以乘这两个因子放缩

uint16_t rbits = (R*0.125);
uint16_t gbits = (G*0.250);
uint16_t bbits = (B*0.125);

然后移位,最后再通过或运算拼接起来,得到色彩编码。

rgb[i] = (rbits<<11)|(gbits<<5)|bbits;

好啦,完毕。

这篇关于怎样把mlx90640的输出显示为彩色的热成像图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/689522

相关文章

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能