由于红外传感器上报给服务器的数据是一维数组,要想显示图像就需要将数据转为二维数组矩阵
//传感器横轴像素
int sourcePixelRowCount = 8;
int len = temperatureList.length;
//传感器纵轴像素
int lineNum = len % sourcePixelRowCount == 0
? (len ~/ sourcePixelRowCount).toInt()
: ((len / sourcePixelRowCount) + 1).floor();
for (var i = 0; i < lineNum; i++) {
int startIndex = i * sourcePixelRowCount;
//截取数组指定长度后生成新数组
Iterable<double> range = temperatureList.getRange(startIndex ,startIndex + sourcePixelRowCount);
temperature.add(range.toList());
}
4.画面镜像翻转,二维数组重新排序
如果不进行镜像翻转,显示的画面将和实际的画面是相反的,左右相反
5.双三次多项式插值提升像素算法
插值提升像素,锐化边缘后,提升后像素为32×32,看下图片基本可以看到物体轮廓了。
//计算权重
static dynamic getCubicWeight(double v) {
double a = -0.5;
// 取整
int nv = v.floor();
// 坐标差值集合
List<double> xList = new List(4);
// 坐标集合
List<int> xs = new List(4);
// 最近的4个坐标差值
xList[0] = nv - v - 1;
xList[1] = nv - v;
xList[2] = nv - v + 1;
xList[3] = nv - v + 2;
//
xs[0] = nv - 1;
xs[1] = nv;
xs[2] = nv + 1;
xs[3] = nv + 2;
// 计算权重
List<double> ws = List(4);
for (int i = 0; i < 4; i++) {
double val = xList[i].abs();
double w = 0;
// 基于BiCubic基函数的双三次插值
if (val <= 1) {
w = (a + 2) * val * val * val - (a + 3) * val * val + 1;
} else if (val < 2) {
w = a * val * val * val - 5 * a * val * val + 8 * a * val - 4 * a;
}
ws[i] = w;
}
return {'weight': ws, 'coordinate': xs};
}