MLX90640的阵列插值处理-多项式插值由32×24像素到512×384像素(附从温度阵列转化为热成像图代码)
由于大四final year project的需求,需要利用mlx90640热成像芯片处理,由于像素过于低,无法利用灰度图进行人脸识别,因此必须扩展像素。这里link 采用了博主的代码,将Pascal版本改编为python版本的代码。
下面是改编的函数的代码,命名为func.py,函数分为:
PolynomialInterpolationArr(SourceDatas,Dir, times) 。 SourceDatas为一个列表,里面是温度矩阵中的一行温度数据,最后返回值为插值结束后的温度数据。具体插值方法见上面链接。
GetPolyData_U(OriginData,times,coes) 会返回一个系数,该系数会被应用在PolynomialInterpolationArr函数当中。
chazhi(temp_matrix)是为了主函数直观清晰而写的一个函数。该函数将温度矩阵拆分为一维列表并根据PolynomialInterpolationArr函数进行插值。
整体思路是先将24×32的温度矩阵在行的方向上插值两次,变为24×512的温度矩阵。之后将24×512的矩阵在列上进行两次插值,变为384*512的温度矩阵.
这里用了MLX90640采集的一次人脸温度数据。txt文本放不上来,有需要的可以把project下载下来测试一下情况。
import numpy as np
def PolynomialInterpolationArr (SourceDatas,Dir, times):
arrCount=len(SourceDatas)
Result=[0]*arrCount*4
if (Dir==0) :
startIndex = 2
else :
startIndex = 1
for i in range(arrCount):
Result[startIndex+i*4]=SourceDatas[i]
coes = [0] * 4 #这里初始化一下,之后应该就每次变化不用归0
OriginDatas=np.zeros((2,times))
for i in range(arrCount-times+1) :
for j in range(times) : # 初始化拟合原始数据
OriginDatas[0,j] = j * 4
OriginDatas[1,j] = SourceDatas[i + j]
coes=GetPolyData_U(OriginDatas, times, coes);
for h in range(1,4) :
if times >= 2 :
tempDou = coes[0]+ (h) * coes[1];
if times >= 3 :
tempDou = tempDou+ (h) * (h) * coes[2];
if times >= 4 :
tempDou = tempDou+ (h) * (h) * (h) * coes[3];
Result[startIndex + i * 4 + (h)] = tempDou
# 两端插值,两端插值直接使用线性插值
OriginDatas = np