一、硬件准备
这里用到Kevincoooool的硬件,这里我贴出来,需要的可以去买支持一下这位大佬
https://item.taobao.com/item.htm?spm=a230r.1.14.16.1ca2390ezPeKek&id=655913924680&ns=1&abbucket=17#detail
二、流程
这里我采用直接拉官方的例子,不采用店家的demo(下面一些基本操作就不贴命令了)
-
拉取ESP-WHO ,拉取ESP-IDF 4.4
-
进入例子
esp-who/examples/human_face_detection/web
-
设置芯片为ESP32-S3
-
menuconfig 配置 ,摄像头用到的是OV2640,LCD控制器是ILI9341
1.配置串口打印输出,这里默认的是USB,改回UART0 Channel for console output (Default: UART0) ---> 2.配置LCD驱动ILI9341 (这个配置可以全打开,后面程序会对LCD自动匹配) → Component config → LCD Drivers → Select Screen Controller Espressif IoT Development Framework Configuration [*] ILI9341 3.配置OV2640 这里默认是全部支持 (Top) → Component config → Camera configuration Espressif IoT Development Framework Configuration [*] Support OV7670 VGA [*] Support OV7725 VGA [*] Support NT99141 HD [*] Support OV2640 2MP [*] Support OV3660 3MP [*] Support OV5640 5MP [*] Support GC2145 2MP [*] Support GC032A VGA [*] Support GC0308 VGA [*] Support BF3005(BYD3005) VGA [*] Support BF20A6(BYD20A6) VGA I2C peripheral to use for SCCB (I2C1) --->
-
修改程序 (这里只贴修改部分)
(1).app_main.cpp
摄像头格式:PIXFORMAT_JPEG
使用VGA格式
不使用AI算法
fb_count = 6 (多给缓冲,默认放到SRAM)extern "C" void app_main() { app_wifi_main(); app_mdns_main(); xQueueAIFrame = xQueueCreate(2, sizeof(camera_fb_t *)); xQueueHttpFrame = xQueueCreate(2, sizeof(camera_fb_t *)); //FRAMESIZE_UXGA FRAMESIZE_VGA FRAMESIZE_QVGA register_camera(PIXFORMAT_JPEG, FRAMESIZE_VGA, 6, xQueueAIFrame); //register_human_face_detection(xQueueAIFrame, NULL, NULL, xQueueHttpFrame); // register_cat_face_detection(xQueueAIFrame, NULL, NULL, xQueueHttpFrame); register_httpd(xQueueAIFrame, NULL, true); register_lcd(xQueueAIFrame, NULL, true); i2s_driver_init(); }
(2).
esp-who\components\modules\lcd\who_lcd.h
修改引脚,H V 改成320 x 240
#define BOARD_LCD_MOSI 11 #define BOARD_LCD_MISO -1 #define BOARD_LCD_SCK 12 #define BOARD_LCD_CS 10 #define BOARD_LCD_DC 9 #define BOARD_LCD_RST -1 #define BOARD_LCD_BL -1 #define BOARD_LCD_PIXEL_CLOCK_HZ (40 * 1000 * 1000) #define BOARD_LCD_BK_LIGHT_ON_LEVEL 0 #define BOARD_LCD_BK_LIGHT_OFF_LEVEL !BOARD_LCD_BK_LIGHT_ON_LEVEL #define BOARD_LCD_H_RES 320 #define BOARD_LCD_V_RES 240 #define BOARD_LCD_CMD_BITS 8 #define BOARD_LCD_PARAM_BITS 8 #define LCD_HOST SPI2_HOST
(3).
esp-who\components\modules\lcd\who_lcd.c
使用RGB565解码,并且2X压缩给到显示屏
该改成320x240都需要改
.swap_data = 1
.rotate = 4esp_err_t register_lcd(const QueueHandle_t frame_i, const QueueHandle_t frame_o, const bool return_fb) { spi_config_t bus_conf = { .miso_io_num = BOARD_LCD_MISO, .mosi_io_num = BOARD_LCD_MOSI, .sclk_io_num = BOARD_LCD_SCK, .max_transfer_sz = 2 * 320 * 240 + 10, }; spi_bus_handle_t spi_bus = spi_bus_create(SPI2_HOST, &bus_conf); scr_interface_spi_config_t spi_lcd_cfg = { .spi_bus = spi_bus, .pin_num_cs = BOARD_LCD_CS, .pin_num_dc = BOARD_LCD_DC, .clk_freq = 40 * 1000000, .swap_data = 1, }; scr_interface_driver_t *iface_drv; scr_interface_create(SCREEN_IFACE_SPI, &spi_lcd_cfg, &iface_drv); esp_err_t ret = scr_find_driver(SCREEN_CONTROLLER_ILI9341, &g_lcd); if (ESP_OK != ret) { return ret; ESP_LOGE(TAG, "screen find failed"); } scr_controller_config_t lcd_cfg = { .interface_drv = iface_drv, .pin_num_rst = BOARD_LCD_RST, .pin_num_bckl = BOARD_LCD_BL, .rst_active_level = 0, .bckl_active_level = 0, .offset_hor = 0, .offset_ver = 0, .width = 240, .height = 320, .rotate = 4, }; ret = g_lcd.init(&lcd_cfg); if (ESP_OK != ret) { return ESP_FAIL; ESP_LOGE(TAG, "screen initialize failed"); } g_lcd.get_info(&g_lcd_info); ESP_LOGI(TAG, "Screen name:%s | width:%d | height:%d", g_lcd_info.name, g_lcd_info.width, g_lcd_info.height); app_lcd_set_color(0x000000); vTaskDelay(pdMS_TO_TICKS(200)); app_lcd_draw_wallpaper(); vTaskDelay(pdMS_TO_TICKS(200)); xQueueFrameI = frame_i; xQueueFrameO = frame_o; gReturnFB = return_fb; //下面暂时不运行了 xTaskCreatePinnedToCore(task_process_handler, TAG, 4 * 1024, NULL, 5, NULL, 0); return ESP_OK; }
(4).
esp-who\components\modules\camera\who_camera.h
频率改成20M,按照店家说,这里不会影响,但我实测,这里使用原本的15M,WEB端会有卡顿情况出现
#define XCLK_FREQ_HZ 20000000
(5).
esp-who\components\modules\camera\who_camera.c
不需要修改,这里可以关注一下这些参数
config.jpeg_quality = 12;
越大,则图片质量越差,数据量小,速度快
config.fb_location = CAMERA_FB_IN_PSRAM;
FB放到SRAM
三、结果
在这里插入图片描述