微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 ESP32 通过 HTTP Web 服务器将 MLX90640 IR 视频流式传输为 MJPEG

如何解决使用 ESP32 通过 HTTP Web 服务器将 MLX90640 IR 视频流式传输为 MJPEG

我对 HTTP 或任何 Web 服务器代码完全没有经验。我正在尝试使用 ESP32 在网络服务器上流式传输我的 MLX90640 视频。目前,我将 MLX90640 连接到 ESP32,并且可以在串行监视器中重复打印像素以显示 ASCII 视频。我现在正在努力从这个开始,在我的网络服务器上观看视频。

我的 MLX90640 被输出一个 32x24 的浮点数组中。然后我将其映射到 0-255 并将其用作 16 位相机颜色数组的输入。我想我在尝试将 uint16_t 转换为描述 jpeg 帧所需的任何类型的数据时遇到了问题。

当我在 chrome 上拉起我的服务器时,我目前看到一个全黑屏幕,屏幕中央有一个白色的小框。下面,我已将所有相关功能附加到项目的这一部分,但我会监控并在需要时发布我的其余代码

我读过很多类似的项目,但其中大多数使用不同的相机类型,而且我无法复制 MLX90640 所需的功能。任何关于下一步尝试或阅读的建议将不胜感激!

提前致谢。

float frame[32*24]; // buffer for full frame of temperatures

float MinTemp;
float MaxTemp;

const char HEADER[] = "HTTP/1.1 200 OK\r\n" \
                      "Access-Control-Allow-Origin: *\r\n" \
                      "Content-Type: multipart/x-mixed-replace; boundary=123456789000000000000987654321\r\n";
const char BOUNDARY[] = "\r\n--123456789000000000000987654321\r\n";
const char CTNTTYPE[] = "Content-Type: image/jpeg\r\nContent-Length: ";
const int hdrLen = strlen(HEADER);
const int bdrLen = strlen(BOUNDARY);
const int cntLen = strlen(CTNTTYPE);

const uint16_t camColors[] = {0x480F,0x400F,0x4010,0x3810,0x3010,0x2810,0x2010,0x1810,0x1811,0x1011,0x0811,0x0011,0x0031,0x0051,0x0072,0x0092,0x00B2,0x00D2,0x00F2,0x0112,0x0132,0x0152,0x0172,0x0192,0x01B2,0x01D2,0x01F3,0x0213,0x0233,0x0253,0x0273,0x0293,0x02B3,0x02D3,0x02F3,0x0313,0x0333,0x0353,0x0373,0x0394,0x03B4,0x03D4,0x03F4,0x0414,0x0434,0x0454,0x0474,0x0494,0x04B4,0x04D4,0x04F4,0x0514,0x0534,0x0554,0x0574,0x0573,0x0572,0x0571,0x0591,0x0590,0x058F,0x058E,0x05AE,0x05AD,0x05AC,0x05AB,0x05CB,0x05CA,0x05C9,0x05C8,0x05E8,0x05E7,0x05E6,0x05E5,0x0604,0x0603,0x0602,0x0601,0x0621,0x0620,0x0E20,0x0E40,0x1640,0x1E40,0x2640,0x2E40,0x2E60,0x3660,0x3E60,0x4660,0x4E60,0x4E80,0x5680,0x5E80,0x6680,0x6E80,0x6EA0,0x76A0,0x7EA0,0x86A0,0x8EA0,0x8EC0,0x96C0,0x9EC0,0xA6C0,0xAEC0,0xB6E0,0xBEE0,0xC6E0,0xCEE0,0xD6E0,0xD700,0xDF00,0xDEE0,0xDEC0,0xDEA0,0xDE80,0xE660,0xE640,0xE620,0xE600,0xE5E0,0xE5C0,0xE5A0,0xE580,0xE560,0xE540,0xE520,0xE500,0xE4E0,0xE4C0,0xE4A0,0xE480,0xE460,0xEC40,0xEC20,0xEC00,0xEBE0,0xEBC0,0xEBA0,0xEB80,0xEB60,0xEB40,0xEB20,0xEB00,0xEAE0,0xEAC0,0xEAA0,0xEA80,0xEA60,0xEA40,0xF220,0xF200,0xF1E0,0xF1C0,0xF1A0,0xF180,0xF160,0xF140,0xF100,0xF0E0,0xF0C0,0xF0A0,0xF080,0xF060,0xF040,0xF020,0xF800,};

uint16_t colorFrame(float color){
   uint8_t colorIndex = map(color,MinTemp-5.0,MaxTemp+5.0,255);
   colorIndex = constrain(colorIndex,255);

   return camColors[colorIndex];
}

void setMinMaxTemps(){
    MaxTemp = frame[0];            // Get first data to find Max and Min Temperature
    MinTemp = frame[0];
    
    for (int x = 0 ; x < 768 ; x++)     // Find Maximum and Minimum Temperature
    {
      MaxTemp = max(MaxTemp,frame[x]);
      MinTemp = min(MinTemp,frame[x]);
    }
}

void handle_videostream(){  

  WiFiClient client = server.client();
  client.write(HEADER,hdrLen);
  client.write(BOUNDARY,bdrLen);
 
  uint16_t frameColor[768];
  char buf[32];

  while (1)
  {
    if (!client.connected())
      break;

    Serial.println("Get the MLX frame!");
    if (mlx.getFrame(frame) != 0) {
      Serial.println("Failed to get the frame..");
    }
          
    setMinMaxTemps();
    for(int i=0; i<768; i++){
      frameColor[i] = colorFrame(frame[i]);
    }
    
    client.write(CTNTTYPE,cntLen);
    sprintf( buf,"%d\r\n\r\n",768*4 );
    client.write(buf,strlen(buf));
    Serial.println(buf);
    
    client.write((char *)frameColor,768*4);
    client.write(BOUNDARY,bdrLen);
    if (!client.connected())
      break;
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。