【DigiKey好物畅享】MLX90640ESF-BAB软件篇

打板回来,焊接装配一气呵成。MLX90640高集成度,低开发门槛,采用I2C通用接口,官方开源驱动库。此次装配的的液晶是TFT320*240,如何显示温度采样结果那,总不能显示原值显示32*24,那也太小了,呵呵,没法看呀。

一、双线插值算法

通过网上浏览相关资料得知,显示图像需要对感应器的采样结果进行插值,才能获得在更大的区域提高显示效果,需要使数据获得平滑的分布,而不能做成锯齿形的界面,当然也可以使用相同的值扩大n倍,这样简单但是显示会出现马赛克的效果,不建议。综合考虑后采用插值算法进行软件设计。

图像转换采用双线性插值,在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。如果选择一个坐标系统使得 的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为:

f(x,y) = (1-x)*(1-y)*f(0,.0) + (1-x)*y*f(0,1) + x*(1-y)*f(1,0) + x*y*f(1,1)

对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v) (其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,是取值[0,1)区间的浮点数),则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:

f(i+u,j+v) = (1-u)*(1-v)f(i,j) + (1-u)*v*f(i,j+1) + u*(1-v)*f(i+1,j) + u*v*f(i+1,j+1)

其中f(i,j)表示源图像(i,j)处的的像素值,以此类推。

void algorithm(void)//双线插值
{
float srcx, srcy, result, u, v;
uint16_t L, H;
uint16_t watchValue;
uint16_t Width, Height;

for (Width = 0; Width < xColDest; Width++)   
{
    for ( Height = 0; Height < yRawDest; Height++) 
    {
		//计算源坐标
		if(Width==0)
			srcx = (float)(Width + 0.0)  / (float)(W_expand) - 0.0;
		else 	
			{
			 srcx = (float)(Width + 0.5)  / (float)(W_expand) - 0.5;
			 if(Width==xColDest-1)
					srcx =  (float)(Width-0.5)  / (float)(W_expand)-0.5;//尾值处理							 
			 }
	 
		if(Height==0)
			srcy = (float)(Height + 0.0) / (float)(H_expand) - 0.0; 
		else
			{
				srcy = (float)(Height + 0.5) / (float)(H_expand) - 0.5;	
				if(Height==yRawDest-1)
				srcy =  (float)(Height-0.5) / (float)(H_expand)-0.5;//尾值处理
				}
		               
        
	//取整和小数部分
			L = (uint16_t)srcx;  
			u = srcx - L; 

			H = (uint16_t)srcy;
			v = srcy - H;

	//边界检查
			L = (L >= xCol-1) ? xCol-2 : L;
			H = (H >= yRaw-1) ? yRaw-2 : H; 
	
			   
	//插值计算
			float w1 = (1 - u) * (1 - v);
			float w2 = (1 - u) * v;
			float w3 = u * (1 - v);
			float w4 = u * v;

			result = w1 * Source_32_24[L][H]    +
							 w2 * Source_32_24[L][H+1]  +
							 w3 * Source_32_24[L+1][H]  +
							 w4 * Source_32_24[L+1][H+1] ;                     
		
			watchValue =(uint16_t)result;	

			destination[Width][Height] =watchValue;

    }
}

}

二、色彩映射算法

温度值,要怎么转换成彩色来显示呢?目前网上已有多个转换方案,还发现有国标。

根据热红外图像及红外辐射特性计算而获得的温度场通过图像处理技术转换为可见光伪彩色图像的原理及方法,包括温度场图像转换为灰度图像算法,灰度图像增强处理算法以及定义灰度值所对应伪彩色 RGB 值的颜色查找表。

国标上是将颜色分解到三基色。每种颜色0~255。

温度转颜色的方法,因为每种颜色基准颜色红R、绿G、蓝B三种基色,数值为0~255,首先假设温度范围的上下限并将实际的温度数据转换为 0~255 之间的数值,根据显示颜色的格式RGB565或RGB888方式来进行转换。即可使用转换后的数值代入下面的伪彩编码计算函数,生成伪彩色。

value =(temp-set.Min_T)*255/(set.Max_T-set.Min_T);//归一化

因为每步都开有内存进行观察,消耗内存过大,实际显示被压缩到显示分辨率120*160,观察一下热成像的视频效果。

这次动手体验,对MLX90640的了解增加很多,MLX90640是一款兼顾精度、易用性与性价比的工业级红外热成像传感器,凭借免校准、低功耗、宽温工作的特性,成为非接触式面阵测温的优选方案,还能减少开发周期。

感谢EEWORLD和得捷提供的机会,非常EEWORLD和得捷提供的宝贵测试机会!两家单位专业严谨、流程规范,高效、有温度,给予充分的支持与指导,让我得以充分展示能力、积累实战经验,全程体验极佳,受益匪浅。感恩信任与认可,祝两家公司发展越来越好!此次测试收获良多,希望能提供更多的机会,给更多的工程师,整体提高应用工程师的技能水平。衷心祝愿两家单位事业蒸蒸日上,再创佳绩!