【ESP32CAM识别图形左边界】(三)识别图像左边界

系列文章目录

ESP32CAM识别图形左边界(一):初步使用ESP32CAM

ESP32CAM识别图形左边界(二):网页添加补光灯按钮

ESP32CAM识别图形左边界(三):识别图像左边界


目录

系列文章目录

前言

一、添加开启边界识别的按钮

        (1) 修改camera_index.h文件

        (2) 修改app_httpd.cpp文件

二、图像数据处理

1.新建结构体

2.具体实现

3.实验结果


前言

        之前两篇文章中,第一篇介绍了ESP32-CAM相机网页相关的使用方法,第二篇介绍了如何在相机的网页中添加自己的内容,最后一篇则真正的开始使用相机里面的图像了,因为我的环境比较简单,图像中只有物体和纯色背景,而且只需要图片中的左边界线。


一、添加开启边界识别的按钮

(1) 修改camera_index.h文件

        同上一篇文章一样,修改网页模板文index_ov2640.html,增加下面的代码,并一起去除了人脸识别的功能开关,然后打包成index_ov2640.html.gz文件,之后使用Beyond Compare以十六进制格式打开。

【ESP32CAM识别图形左边界】(三)识别图像左边界_第1张图片

                        

index_ov2640.html.gz文件的十六进制数据

0x1F,0x8B,0x08,0x08,0x25,0xD3,0xA1,0x61,0x00,0x03,0x69,0x6E,0x64,0x65,0x78,0x5F,0x6F,0x76,0x32,0x36,0x34,0x30,0x2E,0x68,0x74,0x6D,0x6C,0x00,0xE5,0x5D,0x7B,0x73,0xD3,0xC6,0x16,0xFF,0x9F,0x4F,0x21,0x44,0x4B,0xEC,0x69,0xEC,0xD8,0x4E,0x08,0xC1,0xB5,0xC5,0x85,0x10,0xA0,0x33,0xBC,0x4A,0x5A,0xDA,0x99,0x4E,0x07,0xD6,0xD2,0xCA,0x56,0x91,0x25,0x57,0x5A,0xD9,0x49,0x99,0x7C,0x8E,0xFB,0x81,0xEE,0x17,0xBB,0x67,0x1F,0x92,0x56,0xF2,0xEA,0x65,0x83,0xCD,0xE5,0x3A,0x33,0x45,0x96,0xF6,0x9C,0x3D,0xE7,0xFC,0xCE,0x6B,0xD7,0x92,0x3A,0xBA,0x6D,0xF9,0x26,0xB9,0x5E,0x60,0x6D,0x46,0xE6,0xAE,0x71,0x6B,0xC4,0xFF,0xD1,0xE0,0x33,0x9A,0x61,0x64,0xF1,0x43,0xF6,0x75,0x8E,0x09,0xD2,0xCC,0x19,0x0A,0x42,0x4C,0xC6,0x7A,0x44,0xEC,0xCE,0x99,0x9E,0xBF,0xEC,0xA1,0x39,0x1E,0xEB,0x4B,0x07,0xAF,0x16,0x7E,0x40,0x74,0xCD,0xF4,0x3D,0x82,0x3D,0x18,0xBE,0x72,0x2C,0x32,0x1B,0x5B,0x78,0xE9,0x98,0xB8,0xC3,0xBE,0x1C,0x3A,0x9E,0x43,0x1C,0xE4,0x76,0x42,0x13,0xB9,0x78,0xDC,0x97,0x79,0x11,0x87,0xB8,0xD8,0xB8,0xB8,0x7C,0x73,0x3C,0xD0,0x5E,0xBF,0x1B,0x9C,0x9C,0xF6,0x46,0x47,0xFC,0x5C,0x3A,0x26,0x24,0xD7,0xF2,0x77,0xFA,0x99,0xF8,0xD6,0xB5,0xF6,0x29,0x73,0x8A,0x7E,0x6C,0x10,0xA2,0x63,0xA3,0xB9,0xE3,0x5E,0x0F,0xB5,0x47,0x01,0xCC,0x79,0xF8,0x1C,0xBB,0x4B,0x4C,0x1C,0x13,0x1D,0x86,0xC8,0x0B,0x3B,0x21,0x0E,0x1C,0xFB,0xC7,0x35,0xC2,0x09,0x32,0x3F,0x4E,0x03,0x3F,0xF2,0xAC,0xA1,0x76,0xA7,0x7F,0x46,0xFF,0xD6,0x07,0x99,0xBE,0xEB,0x07,0x70,0xFD,0xE2,0x29,0xFD,0x5B,0xBF,0xCE,0x66,0x0F,0x9D,0x7F,0xF0,0x50,0xEB,0x9F,0x2E,0xAE,0x32,0xD7,0x6F,0x6E,0x65,0xBE,0xCE,0x06,0x45,0xD2,0x0B,0xFA,0xB3,0x72,0xFA,0x10,0x9B,0xC4,0xF1,0xBD,0xEE,0x1C,0x39,0x9E,0x82,0x93,0xE5,0x84,0x0B,0x17,0x81,0x0D,0x6C,0x17,0x97,0xF2,0xB9,0x33,0xC7,0x5E,0x74,0x58,0xC1,0x8D,0x32,0xE9,0x58,0x4E,0xC0,0x47,0x0D,0xA9,0x1D,0xA2,0xB9,0x57,0xC9,0xB6,0x4C,0x2E,0xCF,0xF7,0xB0,0xC2,0x80,0x74,0xA2,0x55,0x80,0x16,0x74,0x00,0xFD,0x77,0x7D,0xC8,0xDC,0xF1,0xB8,0x53,0x0D,0xB5,0xE3,0x93,0xDE,0xE2,0xAA,0x02,0xCA,0xE3,0x53,0xFA,0xB7,0x3E,0x68,0x81,0x2C,0xCB,0xF1,0xA6,0x43,0xED,0x4C,0xC9,0xC2,0x0F,0x2C,0x1C,0x74,0x02,0x64,0x39,0x51,0x38,0xD4,0x4E,0x54,0x63,0xE6,0x28,0x98,0x82,0x2C,0xC4,0x07,0x61,0x3B,0x7D,0xA5,0x24,0x62,0x48,0xE0,0x4C,0x67,0x04,0x20,0x5D,0x1B,0x93,0x37,0x9A,0x08,0xA1,0x2A,0x3C,0x4B,0xED,0xA6,0xB6,0x1A,0x72,0x9D,0xA9,0xD7,0x71,0x08,0x9E,0x83,0x3A,0x21,0x09,0x30,0x31,0x67,0x65,0xA2,0xD8,0xCE,0x34,0x0A,0xB0,0x42,0x90,0xC4,0x6E,0x25,0x0A,0xC3,0xC5,0xF5,0x4B,0x9D,0x15,0x9E,0x7C,0x74,0x48,0x47,0xD8,0x64,0x82,0x6D,0x3F,0xC0,0xCA,0x91,0xF1,0x08,0xD7,0x37,0x3F,0x76,0x42,0x82,0x02,0x52,0x87,0x21,0xB2,0x09,0x0E,0xAA,0xF9,0x61,0xEA,0x15,0xD5,0xDC,0x8A,0xA7,0x15,0x03,0x1C,0xCF,0x75,0x3C,0x5C,0x5F,0xBC,0xA2,0x79,0xB3,0xEC,0xF8,0xA8,0x1A,0xC0,0x38,0xF3,0x69,0x99,0x97,0x30,0x5D,0xD7,0x27,0x13,0x71,0xD3,0xEF,0xF5,0xBE,0x5F,0xBF,0x38,0xC3,0xDC,0x4D,0x51,0x44,0xFC,0xED,0x23,0x62,0x2D,0xAC,0x72,0x7A,0xFC,0x6B,0x8E,0x2D,0x07,0x69,0x2D,0x29,0x9C,0xCF,0x7A,0xE0,0x53,0x6D,0x0D,0x79,0x96,0xD6,0xF2,0x03,0x07,0x02,0x01,0xB1,0x74,0xE3,0xC2,0x19,0x28,0x1C,0x0B,0xDC,0x56,0xA8,0x5C,0x12,0x33,0xB2,0x45,0xD4,0x61,0x43,0x3F,0x35,0x52,0x0E,0xFD,0x54,0x06,0x90,0x42,0x47,0xC6,0xBE,0x0C,0x2F,0x59,0xC2,0x22,0xCC,0xE8,0x67,0x8E,0xAE,0x3A,0xA5,0xD8,0xC5,0x83,0x62,0x0C,0xA1,0xCC,0x9A,0x2D,0x18,0xBA,0x9C,0x69,0x1D,0x8D,0x66,0xC9,0xB6,0x9A,0x46,0x30,0x55,0x43,0x4E,0x3F,0xB2,0x53,0x34,0x50,0x57,0xAD,0x6A,0x9A,0x3B,0xF8,0x9F,0xCA,0x87,0xB8,0x26,0x85,0x59,0x84,0x7E,0xEA,0x67,0x92,0x94,0x59,0x65,0x36,0x51,0x30,0x2E,0xCE,0x28,0x6B,0x7C,0x8B,0xA2,0x5B,0xC1,0xB5,0x5C,0x84,0xBA,0xD9,0x45,0xC1,0xB8,0x4C,0x86,0xCA,0x2C,0x43,0x3F,0x37,0x35,0xFA,0x8D,0x3B,0x93,0x88,0x10,0xDF,0x0B,0xB7,0x2A,0x51,0x45,0x71,0xF6,0x57,0x14,0x12,0xC7,0xBE,0xEE,0x88,0x90,0x86,0x38,0x5B,0x20,0x68,0x21,0x27,0x98,0xAC,0x30,0x2E,0x6F,0x37,0x3C,0xB4,0x84,0xBC,0x33,0x9D,0xBA,0x2A,0xDF,0x33,0xA3,0x20,0xA4,0x7D,0xDB,0xC2,0x77,0x80,0x71,0xB0,0x3E,0x71,0x36,0x06,0x6B,0x4E,0xD4,0x31,0x27,0x8A,0xB9,0xFC,0x88,0x50,0x1B,0x2B,0x91,0xF0,0x41,0x1D,0x87,0x5C,0x2B,0xAF,0x89,0x48,0x54,0x5C,0x89,0x43,0xB0,0xB4,0x2C,0x64,0xE5,0x1A,0x9A,0x33,0x6C,0x7E,0xC4,0xD6,0x0F,0x95,0x6D,0x58,0x55,0x7B,0xD8,0x75,0xBC,0x45,0x44,0x3A,0xB4,0x9D,0x5A,0x7C,0x11,0xCC,0x99,0x43,0xC6,0x2A,0x0E,0x06,0x65,0x4D,0xC5,0xBD,0xC5,0x55,0xB9,0x11,0x64,0x61,0x0D,0x17,0x4D,0xB0,0x5B,0x26,0xB2,0x08,0x86,0x82,0xB4,0x2B,0x72,0x55,0x71,0xEF,0xC6,0x24,0x4B,0x8B,0xD7,0xC9,0xFD,0xEF,0x6B,0xDB,0x91,0x1D,0x1F,0x66,0x4E,0x85,0xD8,0x85,0x00,0x2B,0x6A,0xBD,0x61,0xCC,0x0A,0x64,0x28,0x9D,0x20,0x40,0xDE,0x14,0x43,0x2E,0xB8,0x3A,0x8C,0x0F,0xCB,0x17,0x06,0xB5,0xD4,0xA7,0xA9,0xFA,0x5E,0xF9,0x42,0x84,0x27,0x84,0x0D,0x9A,0x11,0x09,0xD6,0xD2,0xF9,0xFB,0x4A,0xA7,0xE0,0xFD,0x88,0x32,0x60,0xB2,0x2E,0xA5,0xEC,0xEF,0x2B,0x33,0x42,0xBC,0xD2,0xB3,0xED,0xAA,0xB5,0xA2,0x6D,0x1F,0xF7,0x8E,0x4F,0x2A,0x1B,0x26,0xA5,0x96,0xB9,0xF5,0xA2,0x22,0x63,0x24,0xD9,0xA4,0x1A,0x82,0xE1,0xCC,0x5F,0xE2,0x40,0x01,0x44,0x4E,0xDC,0x93,0x07,0x27,0x56,0x0D,0x6E,0x08,0xF2,0xFD,0x52,0x95,0x4D,0xB3,0xEC,0x06,0x7D,0x73,0x50,0xEA,0x98,0x9C,0x5D,0x17,0xBC,0x01,0x4D,0x5C,0x6C,0x95,0xA4,0x67,0x0B,0xDB,0x28,0x72,0x49,0x85,0xBD,0x51,0x8F,0xFE,0x95,0xCD,0xC8,0xE2,0xEA,0x0F,0xBA,0xD1,0x31,0x66,0x91,0xF0,0xA7,0x62,0xCE,0xB8,0x76,0xA2,0xC5,0x02,0x23,0x18,0x65,0xE2,0xA2,0x25,0x69,0xAD,0x9E,0x59,0x9D,0xB8,0x6A,0x2D,0x44,0x2B,0x5D,0x31,0xE9,0x86,0x1A,0xE9,0x3C,0xB4,0x7D,0x33,0x52,0x95,0xE9,0x7A,0x2E,0xB5,0xCE,0x6F,0x18,0x9B,0x2C,0x74,0x1D,0xE6,0xD8,0x91,0xE7,0x51,0x44,0x3B,0x24,0x00,0x35,0x15,0x13,0xD5,0x33,0xDC,0x46,0xD1,0x99,0x31,0x6C,0xD1,0x66,0x4C,0x2E,0x00,0x15,0x89,0x22,0xC9,0x21,0x5A,0xE8,0x83,0x52,0x31,0xAB,0xED,0xEC,0x42,0x66,0xD1,0x5C,0xD5,0x18,0xC4,0x93,0xF5,0xA1,0x8A,0xF1,0xE9,0x82,0xE9,0x04,0xB5,0x7A,0x87,0xBD,0xC3,0x63,0xF8,0x8F,0xA2,0x41,0x2F,0x77,0x2E,0x61,0xDE,0x02,0xCF,0xCB,0x25,0x9F,0xEA,0x7D,0x92,0xA2,0x34,0x56,0x89,0x45,0xFD,0x48,0xCA,0x6E,0x98,0xF4,0xBB,0x15,0x85,0xA5,0xC0,0xA5,0x9B,0x3B,0xA2,0xC2,0x5B,0x9A,0x42,0x3C,0xF7,0xFF,0xE9,0xF0,0xAA,0xFA,0x7F,0xEF,0xED,0x92,0x29,0xBE,0x69,0x4F,0x6F,0x6C,0x97,0x70,0xDF,0xBE,0xD1,0x2B,0x46,0xBD,0x23,0xFA,0x19,0x90,0xD0,0x83,0x45,0x55,0x00,0xAB,0xAB,0xC2,0x9E,0x47,0x1A,0xB3,0x81,0x0D,0x6C,0xC7,0x75,0x3B,0xAE,0xBF,0xAA,0xEE,0x44,0xCA,0x3D,0x79,0xCD,0x4F,0xAB,0x5D,0x7E,0x53,0x69,0x23,0xC8,0x5C,0xFF,0x13,0xD2,0x7E,0xDB,0x01,0x57,0x1A,0x1A,0x9B,0x15,0x8A,0x0D,0xFC,0x71,0xBB,0x89,0x6A,0xB9,0x12,0xEF,0x04,0x4B,0x17,0x73,0xE1,0xCA,0x21,0xE6,0x6C,0x83,0x45,0xD5,0xC2,0x0F,0x1D,0xFE,0x1B,0x4D,0x80,0x5D,0x44,0x3B,0xF8,0x8D,0x96,0xDC,0x95,0x0B,0x13,0x99,0xBC,0x8E,0x26,0xCC,0x74,0x5F,0xCF,0x76,0x49,0x97,0xF7,0x0E,0xC5,0xB9,0x5A,0xED,0xD6,0x15,0xED,0x7E,0x36,0x32,0xD4,0x83,0x1A,0x64,0xF4,0x38,0x69,0x4F,0x03,0x7C,0x5D,0x43,0x99,0x43,0xF1,0xEF,0x90,0x6F,0x88,0x6E,0xBE,0xF6,0x67,0x05,0x40,0x78,0x51,0xF7,0x24,0xAC,0x31,0x75,0xF1,0x94,0x75,0xFC,0x31,0xD9,0xEE,0xD3,0xF5,0x1A,0xE9,0xA6,0xA4,0x84,0xAA,0x5D,0x35,0xAE,0xBE,0xCA,0x8B,0x2E,0xB6,0x49,0xC1,0xAF,0x19,0xAC,0x4F,0x3D,0x2E,0xCF,0x6E,0x1D,0x69,0x9F,0xA0,0x32,0x73,0x24,0xBB,0x72,0xC5,0xDE,0xA7,0xE4,0x4C,0xB3,0x67,0x63,0xE6,0xC5,0x90,0xC4,0xED,0x33,0x83,0x19,0xC6,0xCC,0x45,0xC9,0x07,0x78,0xF0,0xEF,0xAD,0xC1,0xA9,0xF2,0xC7,0x82,0x92,0xC1,0x65,0xA2,0x15,0x6E,0x6B,0xAD,0x97,0xAC,0xC2,0x05,0xB2,0x9C,0x8B,0x94,0x40,0x95,0x47,0x65,0x59,0x86,0x59,0xDF,0xA3,0x29,0x75,0x76,0x67,0x8E,0xA0,0xED,0xA5,0xEE,0x8A,0x80,0xA3,0x0A,0xBF,0x3A,0xEE,0x2E,0x6D,0x1A,0xF6,0x4F,0x7B,0x15,0x53,0x9A,0xAE,0x1F,0x96,0xC7,0x15,0x9A,0x80,0xFD,0x22,0xA2,0x98,0x48,0x6C,0x5D,0x2A,0x77,0x9E,0x98,0x73,0x2B,0xAF,0xD4,0x2A,0xDD,0xA5,0x31,0x55,0x1E,0x8E,0x39,0x9B,0xF7,0x7B,0xCA,0x4C,0x5B,0xBA,0xFF,0x46,0xF0,0x15,0xAC,0x37,0xE9,0x0F,0x72,0x43,0xCD,0xC4,0xEA,0x34,0x9A,0x29,0x72,0xFD,0x3A,0x9B,0x80,0xA5,0x38,0xCC,0x1C,0xCB,0xC2,0xA5,0xBB,0x9C,0x74,0xCD,0x9B,0x63,0x11,0x1F,0x8D,0x8E,0xA4,0x1B,0x58,0x46,0x47,0xE9,0xBD,0x36,0x23,0x7A,0x17,0x8B,0x7C,0x9F,0x0B,0xFF,0x91,0x45,0x33,0x5D,0x14,0x86,0x63,0x9D,0xDE,0x8D,0xA1,0x67,0x6F,0x7B,0x19,0x59,0xCE,0x52,0x73,0xAC,0xB1,0xEE,0xFA,0x53,0x3F,0x77,0x8D,0x5D,0xE7,0xDB,0xDE,0x10,0xA9,0x63,0x3D,0xF3,0x93,0x80,0xCE,0xA8,0xD2,0x53,0xBA,0x71,0xF7,0xCE,0x83,0xFB,0xF7,0x4F,0x7F,0xBC,0xEB,0x4D,0xC2,0x85,0xF8,0xEF,0x2F,0xFC,0x17,0x94,0xD7,0xEF,0x06,0xA7,0x27,0xD0,0xD0,0x62,0x42,0x1C,0x6F,0x1A,0x8E,0x8E,0x18,0xD3,0x9C,0x20,0x47,0x20,0x49,0x81,0x6C,0x22,0xA1,0xAB,0xC4,0x8B,0x87,0x84,0x90,0xA3,0x26,0x28,0x50,0x0C,0x61,0xC3,0x78,0xBB,0xC0,0x3A,0x2D,0x9D,0x25,0xB6,0x89,0x7F,0x95,0xD7,0x80,0x29,0x25,0xB2,0x9E,0x18,0x85,0xAD,0x22,0x86,0x40,0xC6,0xC8,0xE9,0xEF,0x21,0x05,0x63,0x12,0xF9,0x84,0xF5,0xA5,0xED,0x79,0x3E,0xB5,0x1D,0xA0,0x39,0xA6,0x89,0x48,0x9C,0x2C,0x66,0x93,0x47,0x22,0xA1,0xD4,0x8D,0xB7,0x98,0x85,0x2B,0xA0,0xAC,0x34,0xEB,0x1A,0x17,0x91,0x41,0x33,0xF3,0xEB,0xB1,0x88,0x62,0xC7,0xB4,0x83,0x98,0xDB,0x54,0x08,0xC4,0xD8,0xF9,0x0B,0xE6,0x60,0x4B,0xE4,0x46,0x60,0xDA,0x7E,0x4F,0x37,0x7E,0xFD,0xFD,0xD9,0xA3,0x16,0x24,0xA2,0xDE,0x55,0x7F,0xD0,0xEB,0xB5,0x47,0x47,0x7C,0x48,0x63,0x5E,0x0F,0x74,0xE3,0x92,0xB1,0x1A,0x9C,0x01,0xAB,0xDE,0xE0,0x64,0x73,0x56,0x67,0xBA,0xC1,0x38,0x01,0x93,0xAB,0xFB,0xA7,0x67,0x9B,0x33,0xBA,0x0F,0x32,0xBD,0x03,0x4E,0x67,0xA0,0xDD,0xE9,0x36,0xCA,0x9D,0xEA,0x06,0xE5,0x03,0x51,0x71,0x75,0x72,0xB6,0x05,0x9F,0x7B,0xBA,0x28,0x89,0xD4,0x65,0xE3,0x23,0xDD,0x38,0xFF,0xE9,0x69,0xEB,0x04,0x64,0x1C,0x3C,0x38,0xDD,0x9C,0xF7,0x89,0x6E,0xFC,0x4C,0x85,0x3C,0x1E,0x00,0xA3,0x93,0x2D,0x84,0x3C,0xD6,0x8D,0xE7,0x8C,0x13,0x70,0xB9,0xEA,0xDF,0xDF,0x42,0x24,0x70,0xAF,0x9F,0x19,0x27,0xF0,0x2F,0xEA,0x5E,0x35,0x39,0x41,0xBE,0x64,0xA6,0x29,0x89,0xD3,0xF5,0xEC,0x93,0xB9,0x5C,0x16,0xC6,0x7F,0x47,0x50,0x3A,0xC8,0x75,0xE3,0x20,0x16,0x74,0xA0,0x12,0x3F,0xA8,0x17,0xBF,0x92,0x24,0xC9,0xCF,0x72,0xBA,0xD1,0xEF,0x55,0x68,0xC0,0x68,0xE5,0x2C,0xC8,0x88,0x33,0x0A,0xE8,0xB4,0x93,0x60,0x31,0x4C,0x6F,0xFD,0x00,0x1F,0x3D,0xD6,0xA5,0xB8,0xDE,0x28,0x45,0x28,0xA4,0x45,0x57,0xBA,0x71,0x7A,0x5C,0x65,0xEF,0x2D,0xE0,0x98,0xB0,0x36,0xC5,0xC3,0x61,0xD8,0x18,0x91,0x94,0x54,0x37,0x1E,0x27,0xC7,0xDB,0xE0,0xD2,0x19,0x6C,0x81,0x8B,0x24,0x0E,0x87,0xA6,0x33,0x10,0xD0,0x0C,0xF4,0x34,0x22,0x3E,0x27,0x30,0x55,0xD2,0x6E,0x83,0x0B,0x2D,0xE2,0x01,0x0A,0x49,0x63,0x54,0x62,0x42,0x48,0x6B,0xE2,0x68,0x6F,0x88,0x24,0xA2,0x7C,0x03,0x78,0x84,0x88,0x44,0x01,0xBB,0x21,0xAE,0x31,0x22,0x29,0x29,0xD4,0xC3,0xE4,0x78,0x6F,0xA8,0x48,0xE2,0x7C,0x0B,0xB8,0x2C,0xB0,0xE9,0x20,0xF7,0x3D,0xB6,0x6D,0x28,0x59,0xCD,0xB1,0xC9,0x90,0x03,0x3E,0xFC,0xBB,0x76,0xC1,0xBE,0x37,0xEE,0x11,0x73,0xEC,0x3E,0x57,0xA3,0xD8,0x53,0xF7,0x2D,0xAF,0xFC,0x44,0xCE,0x0D,0x3B,0x84,0x3E,0x30,0xC1,0x53,0xB6,0x52,0xDE,0x98,0xC7,0x40,0x37,0x9E,0x05,0xE8,0x9A,0x3D,0x5B,0xB0,0x4D,0xD3,0xF3,0x16,0x5B,0xDA,0x2F,0xB0,0x14,0xDC,0xA6,0x03,0x7B,0x16,0x60,0x58,0x26,0x6E,0xC5,0xE5,0x1E,0x14,0x33,0x38,0xD8,0x8E,0x09,0x34,0xAC,0x97,0x78,0xE1,0xA0,0xAF,0xA1,0xE1,0x42,0xAB,0x49,0xE3,0xB0,0x00,0x1A,0xDD,0x78,0xF4,0xDB,0xE3,0xC6,0x49,0x8A,0xEF,0x37,0xD7,0xF1,0x70,0x9E,0x9D,0x84,0x80,0xFA,0xDA,0x62,0x53,0x1D,0x39,0x75,0x17,0x9C,0x0A,0xBD,0x62,0x01,0xD9,0xF6,0x9C,0x2E,0xA9,0x59,0x4F,0xC7,0x2F,0x97,0xC1,0x40,0x88,0xF7,0x53,0xE4,0x34,0xAF,0x2B,0x31,0x21,0x43,0x4A,0x7B,0x06,0x47,0xBB,0x82,0x8B,0x4F,0xBB,0x37,0xCC,0x84,0xD6,0xFB,0x06,0x0E,0x04,0x99,0xFB,0x56,0xF3,0xED,0x08,0x41,0xA7,0x1B,0x80,0xDA,0x4B,0x38,0x68,0x5C,0x65,0x62,0x06,0x5F,0xB8,0xBC,0x3C,0x8A,0x88,0xBF,0x4D,0x65,0xB9,0x8C,0x3C,0xEF,0x7A,0x9B,0xB2,0x72,0xEE,0xFA,0x91,0xB5,0x39,0x07,0xA8,0x29,0xAF,0x6D,0xDB,0x31,0x37,0xAF,0x4A,0x50,0x51,0x9E,0xFB,0xF3,0x9A,0xF4,0x5F,0x38,0x8B,0x63,0xB3,0x79,0x82,0xC0,0x26,0xA0,0x78,0x71,0xAE,0x5D,0x5E,0xBC,0xBA,0x7C,0xFD,0x76,0x37,0xD9,0x01,0xE6,0xDC,0x53,0x62,0xA0,0xDA,0xEE,0x3B,0x27,0x80,0x10,0x83,0x4D,0x70,0x1A,0x70,0xA0,0x9E,0x5C,0xBE,0xD9,0x15,0x4A,0x83,0xFD,0xC1,0x34,0xF8,0x1A,0x70,0x7A,0xEF,0xE2,0x25,0x76,0x37,0xC0,0x8A,0x13,0x52,0xBC,0xB4,0x17,0xF4,0x68,0x6F,0x0B,0xB9,0x44,0x94,0x6F,0x60,0x19,0x07,0x5E,0xF1,0x9E,0x09,0xBD,0x49,0xF0,0x70,0x4A,0xDD,0xB8,0xB8,0x5A,0xF8,0x61,0x14,0xD4,0x2C,0xA8,0x6A,0x44,0xB6,0xD9,0x19,0x4C,0x45,0xE1,0x88,0xC4,0x5B,0x83,0x74,0x67,0x3F,0xC1,0x64,0xD0,0x3B,0xF9,0xAC,0xA8,0x50,0xE6,0x5F,0x12,0x98,0xE9,0x06,0x75,0x67,0x4A,0xEB,0xCE,0xB3,0xF3,0xDD,0xA4,0xB2,0xE9,0xDE,0x0A,0xCE,0x74,0xAF,0x05,0x47,0xE3,0x3F,0x8A,0x26,0x30,0x6D,0xB8,0x88,0x10,0x84,0xB0,0x76,0xDE,0x64,0x01,0x21,0x6F,0xAA,0x5F,0x6D,0x13,0x3A,0xB1,0x18,0xD9,0xC8,0x39,0x4E,0xE3,0xE6,0xDE,0x67,0x8D,0x9A,0xE3,0x4A,0x69,0xB7,0x09,0x1A,0xAA,0x89,0x89,0x1D,0x97,0x3E,0xC1,0xD4,0x14,0x10,0x89,0x96,0x63,0xA2,0x9D,0xF3,0x6F,0xDB,0x60,0x33,0xD8,0x06,0x1B,0x59,0xA2,0x2C,0x3C,0xA7,0x5F,0xA8,0xD2,0xF4,0x07,0x67,0x5F,0x12,0x9E,0xC9,0xA2,0x79,0x4E,0x03,0x1A,0xDD,0x78,0xFC,0x66,0x37,0x39,0x8D,0x4E,0x56,0x33,0xA7,0x6D,0x95,0xC1,0x98,0x52,0xFB,0x6E,0xC5,0x56,0x1B,0xA0,0xB1,0xA2,0x82,0xFF,0xB6,0x23,0x34,0x56,0xF5,0xD1,0xF8,0xCC,0x15,0x66,0xF5,0x35,0xE0,0x13,0xA0,0xD5,0xFB,0xE9,0x1C,0x35,0xC6,0x48,0xD0,0xE9,0xC6,0x5B,0xB4,0xD2,0x9E,0xBD,0x7C,0xB4,0x13,0xAC,0xE2,0x49,0xF7,0x83,0x57,0xA2,0xF2,0xBE,0x31,0x73,0xB1,0xD7,0x3C,0xA8,0x28,0x91,0x6E,0xBC,0xC0,0x5E,0xA8,0x9D,0xFB,0x81,0x78,0xDB,0xCC,0x4E,0x50,0x63,0x33,0xEF,0x07,0x32,0xAE,0xF4,0xBE,0xF1,0x9A,0xCD,0x9D,0x20,0xF0,0x83,0xC6,0x90,0x09,0x3A,0xDD,0x78,0xDE,0x79,0xC9,0x8E,0x76,0x02,0x57,0x3C,0xEB,0x7E,0x10,0x4B,0x74,0xDE,0x37,0x68,0x4B,0xDB,0x75,0x16,0x8D,0x21,0x63,0x54,0xBA,0xF1,0xAE,0xF3,0x14,0xFE,0xDD,0x09,0x5C,0x7C,0xC6,0xFD,0x80,0x25,0xB4,0xDD,0x37,0x54,0x96,0xB9,0x6A,0x0C,0x14,0xD0,0xE8,0xC6,0x93,0xF3,0xDF,0xB4,0xD6,0x13,0x7F,0xE5,0xD1,0x1B,0xFF,0xB4,0x8B,0x57,0xED,0x9D,0x20,0x46,0xA7,0xDE,0x0F,0x5E,0x4C,0xE9,0x7D,0xA3,0xC5,0xEE,0x3E,0x9E,0xA0,0xE6,0xE9,0x30,0x26,0xA4,0xF7,0xBE,0xC0,0x91,0xF6,0x18,0xED,0x26,0x21,0x26,0xF3,0xEE,0xA2,0x69,0x4F,0x95,0xDC,0x37,0x4E,0x2E,0xBD,0xE1,0xAA,0x79,0x9B,0x41,0xA9,0x26,0x04,0xAC,0xF0,0x82,0x1E,0x69,0x8F,0xD9,0x1B,0x0A,0x76,0xD3,0x67,0xC4,0x53,0xEF,0x02,0xA7,0x54,0xCF,0xFD,0xE3,0xE4,0xE1,0x8E,0x85,0x09,0xBB,0xC3,0xA5,0x01,0x4E,0x1E,0x8E,0x89,0x5E,0xC0,0xB1,0xF6,0x84,0x7D,0xD9,0x11,0x50,0xC9,0xDC,0xBB,0x81,0x2A,0x55,0x75,0x17,0x60,0xC5,0x0F,0x1A,0xB0,0xB5,0x3E,0x7F,0xA3,0x53,0x15,0x30,0xE2,0x3D,0x2F,0x6C,0x3F,0x06,0x93,0x4E,0x48,0x1C,0xD7,0xD5,0x8D,0x67,0x98,0x68,0x97,0xF4,0x70,0x74,0xC4,0x07,0xD4,0xE7,0x22,0xEE,0xE2,0xA7,0xEF,0x52,0x43,0x73,0xDD,0xB8,0xA4,0xEF,0xBA,0x02,0x5E,0xF4,0x5B,0x73,0x66,0x36,0x32,0xF1,0x7B,0xEC,0x05,0x3E,0x08,0x95,0x00,0x24,0x5E,0x39,0xA2,0x6B,0xF1,0x91,0x74,0xCE,0xB8,0x60,0x83,0xB5,0xA7,0x88,0xFE,0x3C,0x5B,0x35,0x1D,0xFD,0x69,0xD5,0x2C,0xFE,0x05,0x76,0x74,0xE4,0x21,0x85,0xB9,0x0B,0x50,0x18,0xF1,0x97,0xA4,0x15,0xB0,0x4A,0x9E,0x90,0x60,0x96,0x48,0x9F,0x36,0x4A,0xD4,0xCA,0x3F,0x85,0x24,0x76,0x61,0xEB,0x85,0x26,0x7B,0x9E,0x48,0x14,0x39,0x7A,0x98,0x98,0xFF,0x3F,0xFF,0xAE,0xF2,0x19,0xFA,0x0A,0xBB,0x54,0x30,0x5D,0x0B,0x03,0x73,0xAC,0x17,0x3D,0x6F,0x51,0xA0,0xF9,0x91,0x4A,0xF5,0xDC,0x60,0x85,0xAD,0x47,0xA1,0x19,0x38,0x0B,0x62,0xDC,0xB2,0x7C,0x33,0x9A,0x63,0x8F,0x74,0x91,0x65,0x5D,0x2C,0xE1,0xE0,0x85,0x13,0x12,0x0C,0x56,0x68,0x1D,0x3C,0x79,0xFD,0xF2,0x9C,0x3F,0x77,0xF2,0xC2,0x47,0x16,0xB6,0x0E,0x0E,0x35,0x3B,0xF2,0xB8,0x9B,0xB7,0x30,0x1D,0xCB,0x5F,0x1F,0xB8,0x44,0x81,0x36,0x41,0x21,0x7E,0xEE,0x87,0x44,0x1B,0x6B,0x09,0x47,0xD7,0x37,0xD9,0x3D,0x89,0x5D,0x3F,0x70,0xA6,0x8E,0x27,0x46,0x72,0x65,0x7F,0x0D,0x5C,0x18,0x9A,0x50,0xFD,0xA0,0x1D,0x0C,0xCF,0xFA,0x07,0xF4,0x11,0x21,0x80,0x01,0x4E,0x00,0x04,0x18,0x06,0x40,0x70,0x8F,0x0D,0xF1,0x8C,0x10,0x76,0xBB,0xCC,0xE4,0x54,0x40,0x2A,0x6D,0xEB,0x80,0xE3,0x74,0x40,0x9F,0x97,0xBB,0x49,0x28,0xC3,0x99,0xBF,0x2A,0xA3,0x0C,0xF0,0xDC,0x5F,0xE2,0x1C,0x71,0x42,0x2D,0xBC,0xB9,0x72,0xEA,0xD8,0xEB,0x0F,0xDA,0xF1,0x80,0xE4,0x75,0x3C,0x63,0x8D,0x04,0x11,0xCE,0xB2,0xC5,0x5E,0x15,0xD7,0x58,0xAC,0x52,0xC6,0x36,0x72,0xC3,0x1C,0xE7,0x68,0x61,0x21,0x82,0xDF,0xD1,0x2D,0x5B,0x18,0xD0,0xC2,0xEE,0x21,0xDF,0xBF,0x3D,0x14,0x57,0xDE,0x02,0x5F,0x82,0xDB,0xE9,0xAC,0xF2,0x69,0xA0,0xC8,0x7E,0x1D,0x6B,0x5E,0x04,0x21,0xFC,0x90,0xA9,0xA0,0x0D,0x33,0x57,0x19,0xB5,0x0B,0xD9,0x49,0xBC,0x7A,0x98,0xCD,0xC9,0x4E,0x3A,0x36,0x9D,0xB8,0xCB,0x5E,0x84,0x3C,0x06,0x1E,0x07,0x71,0x66,0x3F,0x48,0xDF,0x2F,0x29,0x13,0x31,0x3B,0x74,0x45,0x73,0x2B,0xAE,0x2F,0xC5,0x85,0xDB,0xB7,0x97,0x09,0x5F,0x4D,0x1A,0x06,0x97,0xD2,0x0B,0x37,0x70,0x41,0x7A,0x88,0x6F,0x9D,0x77,0x8E,0x47,0xCC,0x5C,0xE2,0x70,0x2B,0x91,0x3C,0x63,0x81,0xBB,0x77,0xB3,0xDC,0x6E,0x8F,0x05,0x55,0xAA,0x09,0x1F,0x0F,0x91,0x01,0x91,0x07,0x6A,0x8B,0x47,0x3B,0x85,0x48,0x8E,0xDD,0xBA,0x9D,0x31,0x7C,0x22,0xA3,0x4D,0x4D,0xE4,0x58,0xCC,0x40,0xEC,0xC6,0x86,0x76,0xFA,0xE8,0x1B,0x97,0xEF,0x21,0xF3,0xFA,0x16,0x16,0x3F,0x79,0xB6,0xC1,0xFE,0xD4,0x99,0xD3,0x13,0x62,0x7C,0x3A,0x95,0xCC,0x71,0x9A,0xE1,0x48,0x15,0xCB,0xC9,0x4D,0x3F,0x8C,0x1F,0xDD,0xFC,0x17,0x3F,0x40,0xC8,0x8F,0x9A,0xB2,0xC9,0x81,0x0D,0xFD,0x81,0x22,0x3D,0x9F,0x33,0x75,0x32,0xB0,0x80,0x09,0x9B,0x60,0x9D,0x49,0xA9,0xE4,0xF1,0xDD,0x5F,0x0A,0x83,0x30,0x76,0xAB,0x09,0x35,0x05,0x9B,0x15,0x0E,0xCB,0x58,0xB1,0x9A,0x15,0x60,0xD3,0x9F,0x7A,0xF4,0xA1,0x2E,0x05,0x43,0x1E,0x88,0x2D,0x5E,0xD7,0x78,0x9B,0x4A,0x99,0x8B,0x18,0xCB,0x9E,0xBF,0x25,0x0B,0x7F,0x13,0x87,0x5D,0x92,0x02,0x65,0x3F,0xA0,0xFE,0x1F,0x5B,0x9A,0x86,0x48,0xEA,0x68,0xE2,0x69,0xFD,0x38,0x3E,0x52,0x38,0x4C,0xC8,0x7D,0x52,0xA4,0x0C,0x73,0xA2,0xCA,0x21,0x02,0x72,0xF7,0x35,0xF9,0xF9,0xFB,0x09,0xA4,0xD0,0x8F,0x19,0x3E,0xEC,0x97,0x96,0x84,0x09,0x3F,0xC7,0xEF,0x5D,0xEA,0xF8,0x1E,0x56,0x73,0x97,0x83,0x44,0xC5,0x93,0x97,0xF0,0x3C,0xD3,0x68,0x32,0x77,0x88,0x82,0xE1,0x01,0xA4,0x6F,0x15,0x2F,0xD1,0xD4,0xA5,0x04,0x01,0x26,0x51,0xE0,0xC9,0x51,0xC8,0x33,0xD9,0xDF,0x11,0x0E,0xAE,0x81,0xD1,0x87,0xEF,0x3E,0xC5,0x75,0xE1,0xE6,0x88,0x3D,0x6F,0xE0,0xBB,0x0F,0xA1,0x72,0x8C,0xBF,0xFB,0xC4,0xA0,0xBE,0xB9,0x0B,0x53,0xC2,0x17,0x36,0xF1,0xCD,0x07,0xCE,0xC2,0xA6,0x6F,0x8F,0x6D,0x31,0x16,0x31,0x6E,0x5D,0x32,0xC3,0x5E,0x2B,0xC0,0xE1,0x02,0xD8,0xE3,0x34,0x01,0xC6,0x33,0xFA,0x2E,0x86,0x12,0x35,0x6D,0x7D,0x08,0x30,0xD0,0x81,0x00,0xC4,0xD7,0xBE,0xFB,0xC4,0x58,0xDC,0x68,0x36,0x64,0x81,0x70,0x86,0xAD,0x43,0xA8,0x57,0x88,0xD0,0xC7,0x6A,0xBF,0xFB,0x14,0xB3,0xEA,0xF2,0x53,0x37,0x1F,0x12,0x0F,0x49,0x8A,0x48,0x5C,0xFB,0xD8,0x85,0x2E,0xE3,0x75,0xC9,0x50,0xF0,0x83,0x47,0xAE,0xDB,0x3A,0xE0,0x4F,0x1F,0x8B,0xDC,0xDE,0x85,0x46,0xF5,0x02,0x81,0xD8,0x72,0x51,0x60,0xF9,0xCA,0xF7,0x4C,0xD7,0x31,0x3F,0xD2,0x84,0xDE,0xCE,0x0A,0xCE,0x33,0x84,0xDB,0xE5,0x6F,0x93,0x79,0xE5,0x5B,0x38,0xE7,0xA6,0x6D,0x2A,0xC6,0xD1,0x11,0x58,0x19,0x59,0x71,0x2A,0xE3,0x18,0xD1,0xD7,0x0E,0x70,0x33,0x65,0x2C,0xCC,0x95,0x11,0xBA,0x70,0x9B,0xA5,0x55,0x3E,0x56,0x39,0x75,0x5B,0x8E,0x9E,0x96,0xD8,0xE2,0xAF,0xD0,0xF7,0x5A,0xED,0x5B,0x89,0x19,0xD6,0x79,0xD0,0x09,0x24,0x06,0x19,0x13,0x15,0x99,0x29,0xBB,0x12,0x38,0x48,0x33,0x49,0x81,0xCD,0xE8,0x47,0xAA,0x84,0xAC,0x0C,0xB2,0x79,0xFF,0x60,0x2E,0xF3,0xE7,0x21,0x2F,0x9D,0x52,0x46,0x6A,0x4B,0xE6,0xE2,0xFE,0x47,0xDF,0xBB,0x2F,0xB7,0x2F,0xD0,0x93,0x5F,0xB8,0x98,0x1E,0x3E,0xBE,0xFE,0x09,0x4A,0x3E,0x6F,0x5C,0x98,0x2C,0x29,0xC1,0x79,0xD2,0x34,0x56,0x52,0xA6,0x0D,0xA6,0xC4,0x83,0x35,0xFD,0x3C,0xDF,0x94,0x71,0x48,0xD6,0x07,0x19,0x52,0xCA,0xB5,0x9A,0x36,0xB3,0x2A,0x90,0xE8,0xE5,0x5C,0x57,0x46,0x2F,0x2D,0x04,0x24,0x6A,0xE6,0xC8,0xD5,0xC4,0x72,0x4B,0x7C,0x20,0x19,0x3B,0x24,0xFE,0x82,0xAF,0x4C,0x72,0x4E,0xBE,0x72,0x3C,0xCB,0x5F,0x75,0xE9,0xF5,0x96,0x28,0xAD,0xB2,0xA2,0x5D,0xC7,0x03,0x03,0x3E,0xFF,0xE5,0xE5,0x0B,0x9A,0x72,0xE4,0x15,0xCE,0x41,0xB6,0x2F,0x62,0x2F,0xFA,0x55,0xCE,0x40,0x61,0xEB,0x42,0xAB,0xCD,0x53,0x4D,0xD2,0x8E,0xD2,0x48,0xA0,0x87,0x1F,0xF8,0x9C,0xB4,0xF0,0x64,0x00,0x6E,0x57,0xCA,0xE2,0x2F,0xF2,0xA2,0x40,0x1C,0x3E,0x22,0x04,0xDC,0x55,0xE3,0x8E,0x1C,0xD2,0x1C,0x23,0x56,0x87,0xB7,0x34,0x19,0xFC,0x82,0x90,0x4F,0xCD,0x24,0x62,0x2C,0x2B,0xBC,0x94,0x27,0xD1,0x02,0xE2,0x12,0x3F,0x7C,0x6F,0x4E,0x20,0x35,0x3E,0x01,0xCF,0xEF,0x7A,0xA0,0x41,0xFB,0xA6,0x4C,0x1D,0x6E,0xAE,0x14,0xC8,0xBA,0x42,0xB0,0x24,0xA4,0xE6,0x96,0xB1,0x8F,0x9A,0x9D,0xEC,0xBD,0x17,0x5E,0xDC,0xDA,0x16,0x19,0x76,0xBC,0x6E,0x5A,0xDE,0xDD,0x64,0x18,0xA4,0xE9,0x65,0x4D,0xD8,0x5C,0x03,0x23,0xF9,0x45,0x3C,0x20,0x96,0x5D,0x0E,0x88,0x02,0xD9,0xB3,0xBD,0x5F,0xAE,0x59,0xC8,0x41,0x2E,0x72,0x98,0x46,0xDF,0x3E,0x30,0xA3,0xE5,0x59,0x38,0x41,0x9D,0x32,0xA1,0xCC,0x7F,0xA5,0xF5,0x82,0xCF,0x10,0x4B,0x9B,0xEF,0x51,0xB3,0xB5,0xE1,0x3C,0x02,0x2B,0xCD,0x63,0x9F,0xE4,0xE7,0x68,0xC3,0x96,0x04,0x0F,0x34,0x70,0x65,0x41,0x0D,0x97,0xA5,0x4C,0x20,0xBA,0xBD,0x0A,0x02,0xE9,0x56,0x26,0x89,0x56,0xEA,0x22,0x4B,0xD3,0x5F,0xFE,0xE6,0x1B,0xC6,0x02,0xB8,0xAE,0x6B,0xAE,0xC0,0x09,0xC6,0xB5,0x13,0xB7,0xA1,0x44,0xA2,0xAD,0x92,0x9C,0xA6,0xA0,0x2D,0x5E,0x6F,0x89,0x73,0xDE,0x54,0xD4,0x0A,0xAF,0xB7,0xC1,0x37,0x92,0x83,0xC4,0x37,0x35,0xA6,0x26,0xC4,0xE5,0xF6,0xC6,0xB2,0xBD,0xE3,0xE5,0x40,0x05,0x85,0x7C,0xEF,0x25,0x37,0x17,0xAE,0x69,0x2E,0x2C,0xCC,0x45,0x09,0xD2,0x0E,0xB4,0x7A,0x6D,0x92,0xF8,0xFF,0x6F,0x8F,0x53,0xCD,0x56,0x93,0x52,0x39,0x45,0xEF,0x2F,0xA9,0x57,0x4E,0x90,0x79,0x40,0x83,0xAB,0xB5,0x9A,0xD4,0x53,0x2B,0x5E,0x3B,0x50,0x82,0x54,0x2D,0xF5,0x0A,0x23,0x56,0x85,0xEF,0x8F,0xD2,0x36,0x86,0xFE,0x3F,0x14,0x92,0xD7,0x45,0x24,0xC2,0xF2,0x1D,0x46,0x98,0xB6,0x97,0x9C,0x4A,0x96,0x1F,0x99,0xB3,0x09,0x69,0x69,0xA5,0x8D,0x07,0xF1,0x4A,0x99,0x7C,0xAD,0xA5,0x5F,0x32,0x3A,0xF5,0xF5,0x94,0x01,0x6F,0xD2,0x0D,0xED,0x5E,0x7E,0x19,0xCB,0xDB,0x25,0xAE,0x46,0xAE,0x49,0x92,0x07,0x24,0x4A,0x65,0xC6,0x24,0x3E,0xCD,0xE9,0x8B,0xC4,0xAC,0x14,0x05,0xB9,0x38,0x20,0x2D,0xFD,0x8D,0x8B,0xE9,0x12,0x43,0x3C,0x15,0x73,0xFE,0xD3,0x53,0xCD,0x0F,0x34,0xFE,0xA2,0xB9,0x20,0x79,0xC7,0x87,0x26,0xDE,0xC2,0xC4,0x16,0x72,0x34,0x6D,0x90,0x99,0x13,0x42,0x5F,0x4B,0x9F,0x80,0xC5,0xB7,0xF5,0xE4,0x45,0x4B,0x95,0xEA,0xF1,0x46,0xF6,0xC7,0x44,0x91,0x9C,0x39,0x39,0x4D,0x6A,0xCB,0xDB,0x42,0xC7,0xB5,0xDC,0x51,0xB6,0x74,0x6C,0x60,0xC2,0xE4,0xF2,0x57,0x6B,0x45,0xB5,0x02,0x95,0x86,0x4C,0xC8,0x52,0x5B,0xA6,0xBA,0xAE,0x59,0x53,0xB5,0x3E,0x2F,0x41,0x94,0x6E,0x53,0x29,0x13,0x73,0x31,0x2A,0xDC,0xE2,0xBC,0x16,0xF2,0xCF,0xE8,0x28,0xDE,0x0C,0xE5,0xDF,0xF8,0x2B,0x84,0x46,0x47,0xFC,0x7F,0xE6,0xF5,0x5F,0x0A,0x8A,0x29,0x71,0xE4,0x6B,0x00,0x00

复制到下面的花括号中间,记得修改上方的index_ov2640_html_gz_len的大小。

#define index_ov2640_html_gz_len 4327
const uint8_t index_ov2640_html_gz[] = {
  
};

(2) 修改app_httpd.cpp文件

文件最上面增加一个静态全局变量

static bool linedetect = 0;

cmd_handler增加一个按钮控制命令

【ESP32CAM识别图形左边界】(三)识别图像左边界_第2张图片

    else if(!strcmp(variable, "linedetect")) {
        linedetect = val;
        Serial.printf("linedetect:%d", linedetect);
    }

status_handler函数增加status页面的打印

【ESP32CAM识别图形左边界】(三)识别图像左边界_第3张图片

p+=sprintf(p, "\"linedetect\":%u", linedetect);

网页增加相关的配置就到此结束了,下一步就是对图像数据进行处理。

二、图像数据处理

1.新建结构体

绘图使用的线结构体

typedef struct
{
    float star_point[2];
    float end_point[2];
} line_t;

结果输出的线结构体

typedef struct tag_line_list
{
    float score;
    line_t *line;
    int len;
} line_array_t;

2.具体实现

ESP32CAM图像的数据传输格式:image_matrix数据格式为一维数组,实际格式为[B G R]三个一组数据,第一行的列(共image_matrix->w列)排完,再写第N行(共image_matrix->h行)。

由于数据帧的问题,这里选用240*176(HQVGA)这种比较低的分辨率。

stream_handler的人脸识别功能部分被修改为识别左边界的功能。

static esp_err_t stream_handler(httpd_req_t *req){
    camera_fb_t * fb = NULL;
    esp_err_t res = ESP_OK;
    size_t _jpg_buf_len = 0;
    uint8_t * _jpg_buf = NULL;
    char * part_buf[64];
    dl_matrix3du_t *image_matrix = NULL;
    bool detected = false;
    int face_id = 0;
    int64_t fr_start = 0;
    int64_t fr_ready = 0;
    int64_t fr_face = 0;
    int64_t fr_recognize = 0;
    int64_t fr_encode = 0;

    static int64_t last_frame = 0;
    if(!last_frame) {
        last_frame = esp_timer_get_time();
    }

    res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
    if(res != ESP_OK){
        return res;
    }

    httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");

    while(true){
        detected = false;
        face_id = 0;
        fb = esp_camera_fb_get();
        if (!fb) {
            Serial.println("Camera capture failed");
            res = ESP_FAIL;
        } else {
            fr_start = esp_timer_get_time();
            fr_ready = fr_start;
            fr_face = fr_start;
            fr_encode = fr_start;
            fr_recognize = fr_start;
            if(!linedetect || fb->width > 240){
                if(fb->format != PIXFORMAT_JPEG){
                    bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
                    esp_camera_fb_return(fb);
                    fb = NULL;
                    if(!jpeg_converted){
                        Serial.println("JPEG compression failed");
                        res = ESP_FAIL;
                    }
                } else {
                    _jpg_buf_len = fb->len;
                    _jpg_buf = fb->buf;
                }
            } else {
              image_matrix = dl_matrix3du_alloc(1, fb->width, fb->height, 3);
//              Serial.printf("image: w:%d h:%d size:%d %d", fb->width, fb->height, fb->len, sizeof(fb->buf));
              if (!image_matrix) {
                  Serial.println("dl_matrix3du_alloc failed");
                  res = ESP_FAIL;
              } else {
                  if(!fmt2rgb888(fb->buf, fb->len, fb->format, image_matrix->item)){
                      Serial.println("fmt2rgb888 failed");
                      res = ESP_FAIL;
                  } else {
                    fr_ready = esp_timer_get_time();
                    line_array_t *lines = NULL;
                    if (linedetect) {
                        lines = recoginLines(image_matrix);
                    }
                    fr_face = esp_timer_get_time();
                    fr_recognize = fr_face;
                    if (lines || fb->format != PIXFORMAT_JPEG) {
                      if (lines) {
                        detected = true;
                        fr_recognize = esp_timer_get_time();
                        draw_lines(image_matrix, lines);
                        free(lines->line);
                        free(lines);
                      }
                      if(!fmt2jpg(image_matrix->item, fb->width*fb->height*3, fb->width, fb->height, PIXFORMAT_RGB888, 90, &_jpg_buf, &_jpg_buf_len)){
                        Serial.println("fmt2jpg failed");
                        res = ESP_FAIL;
                      }
                      esp_camera_fb_return(fb);
                      fb = NULL;
                    } else {
                        _jpg_buf = fb->buf;
                        _jpg_buf_len = fb->len;
                    }
                    fr_encode = esp_timer_get_time();
                  }
                  dl_matrix3du_free(image_matrix);
              }
            }
        }
        if(res == ESP_OK){
            res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
        }
        if(res == ESP_OK){
            size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);
            res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
        }
        if(res == ESP_OK){
            res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
        }
        if(fb){
            esp_camera_fb_return(fb);
            fb = NULL;
            _jpg_buf = NULL;
        } else if(_jpg_buf){
            free(_jpg_buf);
            _jpg_buf = NULL;
        }
        if(res != ESP_OK){
            break;
        }
        int64_t fr_end = esp_timer_get_time();

        int64_t ready_time = (fr_ready - fr_start)/1000;
        int64_t face_time = (fr_face - fr_ready)/1000;
        int64_t recognize_time = (fr_recognize - fr_face)/1000;
        int64_t encode_time = (fr_encode - fr_recognize)/1000;
        int64_t process_time = (fr_encode - fr_start)/1000;
        
        int64_t frame_time = fr_end - last_frame;
        last_frame = fr_end;
        frame_time /= 1000;
        uint32_t avg_frame_time = ra_filter_run(&ra_filter, frame_time);
        Serial.printf("MJPG: %uB %ums (%.1ffps), AVG: %ums (%.1ffps), %u+%u+%u+%u=%u %s%d\n",
            (uint32_t)(_jpg_buf_len),
            (uint32_t)frame_time, 1000.0 / (uint32_t)frame_time,
            avg_frame_time, 1000.0 / avg_frame_time,
            (uint32_t)ready_time, (uint32_t)face_time, (uint32_t)recognize_time, (uint32_t)encode_time, (uint32_t)process_time,
            (detected)?"DETECTED ":"", face_id
        );
    }

    last_frame = 0;
    return res;
}

其中用到的函数

均值滤波函数的阈值

#define LINE_RECOGINE_MEDIAN_THD   80

均值滤波函数

uint8_t median(uint8_t sortArray[], uint8_t len) {
  uint8_t i,j,temp,flag;

  for(j=0; j sortArray[j+1]) {
        flag = 1;
        temp = sortArray[j];
        sortArray[j] = sortArray[j+1];
        sortArray[j+1] = temp;
      }
    }
    if (!flag) {
      break;
    }
  }

  return sortArray[(len-1)/2];
}

识别边界线的函数

//image_matrix数据格式为一维数组,实际格式为[B G R]三个一组数据,第一行的列(共image_matrix->w列)排完,再写第N行(共image_matrix->h行)
static line_array_t* recoginLines(dl_matrix3du_t *image_matrix) {
  uint16_t i,j,x,y;
  uint8_t **gray_img = NULL;
  uint8_t **gray_filter_img = NULL;
  float sx,sy;
  line_array_t *line_result = NULL;
  uint8_t medianArray[9];
  bool realse_flag = 1;
  uint16_t line_len[5] = {0};
  uint8_t k=0;
  uint8_t line_num = 0;

  gray_img = (uint8_t**)malloc(sizeof(uint8_t*)*image_matrix->h);
  if (gray_img){
    for(j=0;jh;j++) {
      gray_img[j] = (uint8_t*)malloc(sizeof(uint8_t)*image_matrix->w);
      if (!gray_img[j]) {
        Serial.printf("malloc gray_img[%d] failed",j);
        goto __FREE_POINTER;
      }
    }
  } else {
    Serial.println("malloc gray_img failed");
    goto __FREE_POINTER;
  }

  //灰度化图像
  for (j=0;jh;j++) {
    for (i=0; iw; i++) {
      gray_img[j][i] = uint8_t(0.114 * image_matrix->item[3*(j*image_matrix->w+i)] + 0.587 * image_matrix->item[3*(j*image_matrix->w+i)+1] + 0.2989 * image_matrix->item[3*(j*image_matrix->w+i)+2]);
    }
  }

  //均值滤波
  gray_filter_img = (uint8_t**)malloc(sizeof(uint8_t*)*(image_matrix->h-1));
  if (!gray_filter_img) {
    Serial.println("malloc gray_filter_img failed");
    goto __FREE_POINTER;
  }
  gray_filter_img[0] = (uint8_t*)malloc(sizeof(uint8_t)*(image_matrix->w-1));
  memset(gray_filter_img[0], 0, sizeof(uint8_t)*(image_matrix->w-1));
  if (!gray_filter_img[0]) {
    Serial.println("malloc gray_filter_img[0] failed");
    goto __FREE_POINTER;
  }
  for (y=1; yh-1; y++) {
    gray_filter_img[y] = (uint8_t*)malloc(sizeof(uint8_t)*(image_matrix->w-1));
    memset(gray_filter_img[y], 0, sizeof(uint8_t)*(image_matrix->w-1));
    if (!gray_filter_img[y]) {
      Serial.printf("malloc gray_filter_img[%d] failed",y);
      goto __FREE_POINTER;
    }
    for (x=1; xw-1; x++) {
      medianArray[0] = gray_img[y-1][x-1];
      medianArray[1] = gray_img[y-1][x];
      medianArray[2] = gray_img[y-1][x+1];
      medianArray[3] = gray_img[y][x-1];
      medianArray[4] = gray_img[y][x];
      medianArray[5] = gray_img[y][x+1];
      medianArray[6] = gray_img[y+1][x-1];
      medianArray[7] = gray_img[y+1][x];
      medianArray[8] = gray_img[y+1][x+1];
      gray_filter_img[y][x] = median(medianArray,9)> LINE_RECOGINE_MEDIAN_THD ? 255: 0;
    }
  }
  
  line_result = (line_array_t*)malloc(sizeof(line_array_t));
  if (line_result) {
    line_result->len=0;
    line_result->line = (line_t*)malloc(sizeof(line_t)* image_matrix->h);
    memset(line_result->line, 0, sizeof(line_t)* image_matrix->h);
    if (line_result->line) {
      for(y=1; yh-1; y++) {
        for(x=1; xw-1; x++) {
          if ((gray_filter_img[y][x-1] == 0) && (gray_filter_img[y][x] == 255)) {
            if (y==1) {
              line_result->line[y-1].star_point[0] = x;
              line_result->line[y-1].star_point[1] = y;
              line_result->line[y-1].end_point[0] = x;
              line_result->line[y-1].end_point[1] = y;
            } else {
              line_result->line[y-1].star_point[0] = line_result->line[y-2].end_point[0];
              line_result->line[y-1].star_point[1] = line_result->line[y-2].end_point[1];
              line_result->line[y-1].end_point[0] = x;
              line_result->line[y-1].end_point[1] = y;
            }

            line_result->len++;
            break;
          }
        }
      }
      realse_flag = 0;
    } else {
      Serial.println("malloc line_result->line fail");
      goto __FREE_POINTER;
    }
  } else {
    Serial.println("malloc line_result fail");
    goto __FREE_POINTER;
  }


__FREE_POINTER:
  //释放内存
  if (realse_flag) {
    if (line_result) {
      if (line_result->line) {
        free(line_result->line);
      }
      free(line_result);
      line_result = NULL;
    }
  }
  
  if (gray_filter_img) {
    for (j=0;jh-1;j++) {
      if (gray_filter_img[j]) {
        free(gray_filter_img[j]);
      }
    }
    free(gray_filter_img);
  }

  if (gray_img) {
    for(j=0;jh;j++) {
      if (gray_img[j]) {
        free(gray_img[j]);
      }
    }
    free(gray_img);
  }

  return line_result;
}

这里其实有个地方需要优化,最好不要在一个函数里面频繁malloc和free,但为了适应随时更改的图像分辨率,就直接放到这个函数里面进行malloc了。

增加结果输出函数,在图片里面进行画线

static void draw_lines(dl_matrix3du_t *image_matrix,line_array_t *lines) {
  int x0, y0, x1, y1, w, h, i, j;
  float temp = 0.0;
  uint32_t color = FACE_COLOR_RED;
  fb_data_t fb;
  fb.width = image_matrix->w;
  fb.height = image_matrix->h;
  fb.data = image_matrix->item;
  fb.bytes_per_pixel = 3;
  fb.format = FB_BGR888;
  for (i = 0; i < lines->len; i++){
      // rectangle box
      x0 = (int)lines->line[i].star_point[0];
      y0 = (int)lines->line[i].star_point[1];
      x1 = (int)lines->line[i].end_point[0];
      y1 = (int)lines->line[i].end_point[1];
      w = (int)x1 - x0 + 1;
      h = (int)y1 - y0 + 1;

      if ((x0>0 && abs(x0) < image_matrix->w) && (y0>0 && abs(y0) < image_matrix->h) && (x1>0 && abs(x1) < image_matrix->w) && (y1>0 && abs(y1) < image_matrix->h)) {
        if (w > h) {
          temp = 1.0*h/w;
          for (j=0; j < w; j++) {
            fb_gfx_drawFastHLine(&fb, x0+j, y0+int(temp*j), 1, color);
            fb_gfx_drawFastVLine(&fb, x0+(j+1), y0+int(temp*j), 1, color);
         }
        } else {
          temp = 1.0*w/h;
          for (j=0; j < h; j++) {
            fb_gfx_drawFastVLine(&fb, x0+int(temp*j), y0+j, 1, color);
            fb_gfx_drawFastHLine(&fb, x0+int(temp*j), y0+(j+1), 1, color);
          }
        }
      }
  }
}

        最后附上项目的完整代码地址--ESP32CAM识别图形左边界

3.实验结果

第一步结果:均值滤波的结果

【ESP32CAM识别图形左边界】(三)识别图像左边界_第4张图片【ESP32CAM识别图形左边界】(三)识别图像左边界_第5张图片

【ESP32CAM识别图形左边界】(三)识别图像左边界_第6张图片   【ESP32CAM识别图形左边界】(三)识别图像左边界_第7张图片

第二步结果:实时识别边界线(图像分辨率选择240*176)不过帧率有点低

【ESP32CAM识别图形左边界】(三)识别图像左边界_第8张图片【ESP32CAM识别图形左边界】(三)识别图像左边界_第9张图片


  总结

        以上就是我所有对于ESP32CAM的使用,目前只是提取ESP32CAM的图片,进行简单处理,并识别出简单背景图片中物体的左边界。

你可能感兴趣的:(ESP32CAM,c++,嵌入式硬件,图像处理)