"); //-->
MLX90640 红外热成像仪测温模块开发笔记(四)损坏和不良像素的处理
如前“开发笔记(一)”所说,MLX90640 可能存在不超过 4 个像素的损坏或者不良像素,在温度计算过程完成后,这些不良像素点会得到错误的温度数据,对于处理这些不良数据 MLX 也给出了推荐方法和具体的函数。(其实就是找相邻的正常的温度数据取平均来代替不良数据)

前面开发笔记(一)的内容中所说的 API 库,里面缺少了对不良像素点的处理函数,在这里补上。
int CheckAdjacentPixels(uint16_t pix1, uint16_t pix2)
{
int pixPosDif;
pixPosDif = pix1 - pix2;
if(pixPosDif > -34 && pixPosDif < -30)
{
return -6;
}
if(pixPosDif > -2 && pixPosDif < 2)
{
return -6;
}
if(pixPosDif > 30 && pixPosDif < 34)
{
return -6;
}
return 0;
}
float GetMedian(float *values, int n)
{
float temp;
for(int i=0; i<n-1; i++)
{
for(int j=i+1; j<n; j++)
{
if(values[j] < values[i])
{
temp = values[i]; values[i] = values[j]; values[j] = temp;
}
}
if(n%2==0)
{
return ((values[n/2] + values[n/2 - 1]) / 2.0);
}
else
{
}
return values[n/2];
}
int IsPixelBad(uint16_t pixel,paramsMLX90640 *params)
{
for(int i=0; i<5; i++)
{
if(pixel == params->outlierPixels[i] || pixel == params->brokenPixels[i])
{
return 1;
}
}
return 0;
}
void MLX90640_BadPixelsCorrection(uint16_t *pixels, float *to, int mode, paramsMLX90640
*params)
{
float ap[4]; uint8_t pix; uint8_t line; uint8_t column;
pix = 0;
while(pixels[pix] != 0xFFFF)
{
line = pixels[pix]>>5;
column = pixels[pix] - (line<<5);
if(mode == 1)
{
if(line == 0)
{
if(column == 0)
{
to[pixels[pix]] = to[33];
}
else if(column == 31)
{
}
else
{
}
}
to[pixels[pix]] = to[62];
to[pixels[pix]] = (to[pixels[pix]+31] + to[pixels[pix]+33])/2.0;
else if(line == 23)
{
if(column == 0)
{
to[pixels[pix]] = to[705];
}
else if(column == 31)
{
}
else
{
}
}
to[pixels[pix]] = to[734];
to[pixels[pix]] = (to[pixels[pix]-33] + to[pixels[pix]-31])/2.0;
else if(column == 0)
{
to[pixels[pix]] = (to[pixels[pix]-31] + to[pixels[pix]+33])/2.0;
}
else if(column == 31)
{
}
else
{
to[pixels[pix]] = (to[pixels[pix]-33] + to[pixels[pix]+31])/2.0;
ap[0] = to[pixels[pix]-33];
ap[1] = to[pixels[pix]-31]; ap[2] = to[pixels[pix]+31]; ap[3] = to[pixels[pix]+33];
to[pixels[pix]] = GetMedian(ap,4);
}
else
{
}
if(column == 0)
{
to[pixels[pix]] = to[pixels[pix]+1];
}
else if(column == 1 || column == 30)
{
to[pixels[pix]] = (to[pixels[pix]-1]+to[pixels[pix]+1])/2.0;
}
else if(column == 31)
{
}
else
{
0)
to[pixels[pix]] = to[pixels[pix]-1];
if(IsPixelBad(pixels[pix]-2,params) == 0 && IsPixelBad(pixels[pix]+2,params) ==
{
ap[0] = to[pixels[pix]+1] - to[pixels[pix]+2]; ap[1] = to[pixels[pix]-1] - to[pixels[pix]-2];
if(fabs(ap[0]) > fabs(ap[1]))
{
}
else
{
}
else
{
}
to[pixels[pix]] = to[pixels[pix]-1] + ap[1];
to[pixels[pix]] = to[pixels[pix]+1] + ap[0];
to[pixels[pix]] = (to[pixels[pix]-1]+to[pixels[pix]+1])/2.0;
}
}
}
pix = pix + 1;
}
}
用法很简单,在开发笔记(三)MLX90640_CalculateTo(Frame, MLXPars, 0.95, Tr, Temp);之后添加两行即可。如下(斜体是添加的内容):
……
MLX90640_CalculateTo(Frame, MLXPars, 0.95, Tr, Temp); MLX90640_BadPixelsCorrection(MLXPars.brokenPixels, Temp, 1, MLXPars); MLX90640_BadPixelsCorrection(MLXPars.outlierPixels, Temp, 1, MLXPars);
……
/*
经过上面的处理后,Temp 中的损坏和不良像素点已经处理,Temp 数组中是处理完成后的
768 个温度值。
*/
成果展示。
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
ISO120与XTR101组成的高精度远距离测温电路
初学者在电源电路设计中常犯的错误(以及如何避免)
ATmega48or88or168的开发
Keysight 旨在通过机器学习工具包实现更快的 PDK 开发
嵌入式开发,C语言中REGISTER定义的用法(老站转)
由智能化远程热风扇控制器ADT7460构成的远程测温电路
Arduino发布 Nesso N1 下一代物联网开发套件
减小红外热成像应用的尺寸、功耗和成本
Analog Devices通过CodeFusion Studio 2.0简化嵌入式人工智能
德州仪器推出最新低成本 DSP 入门开发套件
由LM3911单片温度控制集成电路构成单电源测温电路
拆解:Nvidia Jetson AGX Orin 开发者套件
北约创新基金牵头为SatVu热成像公司完成 3000万英镑融资
wince 开发初步
嵌入式LINUX开发套件常见问题解答
开发如走钢丝:平衡机器人技术的创新与安全
蛇形机器人的研究与开发
虚拟原型开发助力实现理想化5G设计
MPLAB®模拟设计器——在线电源解决方案,加速设计
2025年最新无线物联网开发套件
TSV型温度传感器采用恒流源的测温电路
AVR 单片机GCC 程序设计
arm学习资料
嵌入式系统及如何开发自己的嵌入式系统
Dev Tool Bits | 全新MPLAB® AI编码助手助力您的所有编程需求
由LM3911单片温度控制集成电路构成的双电源测温电路
让您的模拟设计灵感,化为触手可及的现实
[转帖]选择嵌入式系统开发Linux的四个因素
Linux下编译运行C语言文件