这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» DIY与开源设计» 电子DIY» 基于M5StickCPlus+AMG8833的双线性插值红外摄像头

共5条 1/1 1 跳转至

基于M5StickCPlus+AMG8833的双线性插值红外摄像头

菜鸟
2024-05-11 11:42:14 打赏

image.png

1、硬件介绍:
M5StickC PLUS主控采用ESP32-PICO-D4模组,,具备蓝牙4.2与WIFI功能,小巧的机身内部集成了丰富的硬件资源,如红外、RTC、麦克风、LED、IMU、按键、蜂鸣器、PMU等,屏幕尺寸1.14寸、135*240分辨率的TFT屏幕,电池容量达到120mAh。
AMG8833这款传感器是 8x8 红外热传感器阵列。 它将通过 I2C 返回一组 64 个单独的红外温度读数。测量范围从 0°C 到 80°C(32°F 到 176°F)的温度,精度为 ± 2.5°C (4.5°F)。最远可探测7 米的距离,最大帧速率为10Hz。

image.png

2、开发环境:
软件开发上使用Vscode+platformIO,使用arduino进行开发。调用了官方的M5stack的库和AMG88的库文件。

1.[env:m5stick-c]

2.platform = espressif32

3.board = m5stick-c

4.framework = arduino

5.monitor_speed =115200

6.lib_deps =

7.# RECOMMENDED

8.# Accept new functionalityina backwards compatible mannerandpatches

9.m5stack/M5StickCPlus @ ^0.1.0

10.sparkfun/SparkFun GridEYE AMG88 Library @ ^1.0.2

3、软件开发:

image.png

软件流程很简单,首先读取AMG8833,读取出的信息为一个8*8的浮点数温度矩阵。因为传感器的限制,读取到的原始温度矩阵分辨率只有64个点,这里需要对矩阵进行扩大,每两个点之间插入5个点,使得矩阵扩展到43*43个点的矩阵。扩展的方式为双线性插值法。在两个方向分别进行一次线性插值(首先在一个方向上使用线性插值,然后再在另一个方向上使用线性插值执行双线性插值。尽管每个步骤在采样值和位置上都是线性的,但是插值总体上不是线性的,而是在采样位置上是二次的。

1.floatBilinearInterpolation(floatq11,floatq12,floatq21,floatq22,floatx1,floatx2,floaty1,floaty2,floatx,floaty)

2.{

3.floatx2x1, y2y1, x2x, y2y, yy1, xx1;

4.x2x1 = x2 - x1;

5.y2y1 = y2 - y1;

6.x2x = x2 - x;

7.y2y = y2 - y;

8.yy1 = y - y1;

9.xx1 = x - x1;

10.return1.0 / (x2x1 * y2y1) * (q11 * x2x * y2y + q21 * xx1 * y2y + q12 * x2x * yy1 + q22 * xx1 * yy1);

11.}

12.

13.//插值算法8*8点阵过于稀疏,使用插值方式放大点阵

14.voidzoommix()

15.{

16.//4个点的值

17.floatq11, q12, q21, q22;

18.uint8_t x11, x22, y11, y22;

19.for(uint8_t row = 0; row < SHARP; row++)

20.{//遍历原始数据的每一个点

21.for(uint8_t col = 0; col < SHARP; col++)

22.{

23.q11 = pixels[row][col];

24.x11 = row * INSERT + row;

25.y11 = col * INSERT + col;

26.q12 = pixels[row][col + 1 == SHARP ? SHARP - 1 : col + 1];

27.q21 = pixels[row + 1 == SHARP ? SHARP - 1 : row + 1][col];

28.q22 = pixels[row + 1 == SHARP ? SHARP - 1 : row + 1][col + 1 == SHARP ? SHARP - 1 : col + 1];

29.x22 = (row + 1) * INSERT + row + 1;

30.y22 = (col + 1) * INSERT + col + 1;

31.

32.//插入值

33.for(uint8_t xpos = 0; xpos <= INSERT; xpos++)

34.{

35.for(uint8_t ypos = 0; ypos <= INSERT; ypos++)

36.{

37.if(x11 + xpos < SHARP + INSERT * (SHARP - 1) && y11 + ypos < SHARP + INSERT * (SHARP - 1))

38.{

39.HDTemp[x11 + xpos][y11 + ypos] = BilinearInterpolation(q11, q12, q21, q22, x11, x22, y11, y22, x11 + xpos, y11 + ypos);

40.}

41.}

42.}

43.}

44.}

45.}

扩展后的矩阵是一个43*43个点的浮点数矩阵。需要使用图像的方式将矩阵展示出来。首先获取矩阵中最高、最低的温度值。将最低到最高温度映射到色彩空间上去,然后使用伪彩色对矩阵进行展示。

1.voidGetabcd()

2.{

3.a = MinTemp + (MaxTemp - MinTemp) * 0.2121;

4.b = MinTemp + (MaxTemp - MinTemp) * 0.3182;

5.c = MinTemp + (MaxTemp - MinTemp) * 0.4242;

6.d = MinTemp + (MaxTemp - MinTemp) * 0.8182;

7.}

8.

9.//浮点数转颜色伪彩色

10.uint16_t GetColor(floatval)

11.{

12.byte red = 0, green = 0, blue = 0;

13.red = constrain(255.0 / (c - b) * val - ((b * 255.0) / (c - b)), 0, 255);

14.if((val > MinTemp) & (val < a))

15.{

16.green = constrain(255.0 / (a - MinTemp) * val - (255.0 * MinTemp) / (a - MinTemp), 0, 255);

17.}

18.elseif((val >= a) & (val <= c))

19.{

20.green = 255;

21.}

22.elseif(val > c)

23.{

24.green = constrain(255.0 / (c - d) * val - (d * 255.0) / (c - d), 0, 255);

25.}

26.elseif((val > d) | (val < a))

27.{

28.green = 0;

29.}

30.

31.if(val <= b)

32.{

33.blue = constrain(255.0 / (a - b) * val - (255.0 * b) / (a - b), 0, 255);

34.}

35.elseif((val > b) & (val <= d))

36.{

37.blue = 0;

38.}

39.elseif(val > d)

40.{

41.blue = constrain(240.0 / (MaxTemp - d) * val - (d * 240.0) / (MaxTemp - d), 0, 240);

42.}

43.

44.// use the displays color mapping function to get 5-6-5 color palet (R=5 bits, G=6 bits, B-5 bits)

45.returnM5.Lcd.color565(red, green, blue);

46.}

47.voidDisplayGradient()

48.{

49.uint8_t row, col;

50.for(row = 0; row < SHARP + INSERT * (SHARP - 1); row++)

51.{

52.for(col = 0; col < SHARP + INSERT * (SHARP - 1); col++)

53.{

54.M5.Lcd.fillRect(row*3,col*3,3,3, GetColor(HDTemp[row][col]));

55.}

56.}

57.}

4、效果演示:

image.png

这是拍摄热水保温杯的效果,杯子没有盖盖。可以看见杯口温度明显高于周边。

image.png

这是拍摄正在工作的空调的照片,可以看见冷气吹出来。

整体来说,AMG8833分辨率还是太低了,无法呈现清晰的物体,而且远处的物体就显示的不很好了,温度显示也不是很准确。不过用来检查电路板的发热点还是挺不错的。

m5plus.zip



高工
2024-05-11 11:44:31 打赏
2楼

谢谢分享


高工
2024-05-11 15:34:52 打赏
3楼

这个不错啊


专家
2024-05-11 19:40:57 打赏
4楼

感兴趣的可以一起学习。谢谢分享!


专家
2024-05-12 00:23:55 打赏
5楼

谢谢分享


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]