前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MLX90640 红外热成像仪测温模块开发笔记(四)

MLX90640 红外热成像仪测温模块开发笔记(四)

原创
作者头像
河北稳控科技
发布2022-07-22 09:37:28
1880
发布2022-07-22 09:37:28
举报
文章被收录于专栏:工程监测工程监测

MLX90640 红外热成像仪测温模块开发笔记(四)损坏和不良像素的处理

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

稳控科技MLX90640 红外热成像仪测温模块
稳控科技MLX90640 红外热成像仪测温模块

前面开发笔记(一)的内容中所说的 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 个温度值。

*/

河北稳控科技MLX90640 红外热成像仪测温模块成果展示
河北稳控科技MLX90640 红外热成像仪测温模块成果展示

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档