diff --git a/examples/camera_web_server/Makefile b/examples/camera_web_server/Makefile deleted file mode 100755 index 3ed5850..0000000 --- a/examples/camera_web_server/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# -# This is a project Makefile. It is assumed the directory this Makefile resides in is a -# project subdirectory. -# - -PROJECT_NAME := camera_web_server - -SOLUTION_PATH ?= $(abspath $(shell pwd))/../../.. - -include $(SOLUTION_PATH)/components/component_conf.mk -include $(IDF_PATH)/make/project.mk - diff --git a/examples/camera_web_server/README.md b/examples/camera_web_server/README.md deleted file mode 100755 index 7b7782b..0000000 --- a/examples/camera_web_server/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Camera with Web Server - -# Preparation - -To run this example, you need the following components: - -* An ESP32 Module: Either **ESP32-WROVER-KIT** or **ESP-EYE**, which we highly recommend for beginners, is used in this example. -* A Camera Module: Either **OV2640** or **OV3660** or **OV5640** image sensor, which we highly recommend for beginners, is used in this example. - -# Quick Start - -After you've completed the hardware settings, please follow the steps below: - -1. **Connect** the camera to ESP32 module. For connection pins, please see [here](../../../docs/en/Camera_connections.md) -2. **Configure** the example through `idf.py menuconfig`; -3. **Build And Flash** the application to ESP32; -4. **Open Your Browser** and point it to `http://[ip-of-esp32]/`; -5. **To Get Image** press `Get Still` or `Start Stream`; -6. **Use The Options** to enable/disable Face Detection, Face Recognition and more; -t. **View The Stream** in a player like VLC: Open Network `http://[ip-of-esp32]:81/stream`; - -For more details of the http handler, please refer to [esp32-camera](https://github.com/espressif/esp32-camera). diff --git a/examples/camera_web_server/README.rst b/examples/camera_web_server/README.rst new file mode 100644 index 0000000..9f38bdd --- /dev/null +++ b/examples/camera_web_server/README.rst @@ -0,0 +1,5 @@ +################################################################################################################################ +Camera with Web Server `[中文] <./README_cn.rst>`_ +################################################################################################################################ + + diff --git a/examples/camera_web_server/README_cn.rst b/examples/camera_web_server/README_cn.rst new file mode 100644 index 0000000..0b046af --- /dev/null +++ b/examples/camera_web_server/README_cn.rst @@ -0,0 +1,54 @@ +################################################################################################################################ +Camera with Web Server `[English] <./README.rst>`_ +################################################################################################################################ + +该示例的输入图片来自摄像头,输出结果网页端。该示例演示了以下模型接口在实际项目中的使用情况。 + ++ `HumanFaceDetectMSR01 `_ + ++ `HumanFaceDetectMNP01 `_ + ++ `CatFaceDetectMN03 `_ + + + +运行示例 +************************************************************************************************ +1. 参考首页的 `说明文档 <../../>`_ 配置示例。 + +2. 该示例具有属于自己的示例配置,可配置 WiFi 属性,如下图: + + .. figure:: ./img/example-config.png + :align: center + + .. + +3. 烧录程序,运行 IDF 监视器: + + .. code:: shell + + idf.py flash monitor + +4. 连接 WiFi,以上图配置为例,WiFi 名为 ``myWiFi``,WiFi 密码为 ``00000000``。 + +5. 打开浏览器,并登录 IP 地址,以上图配置为例,IP 地址为为 ``192.168.4.1``。 + +6. 您可以 + + + ``Get Still`` 拍摄一张照片 + + + ``Start Stream`` 连续获取图片,此时, + + + 打开 ``Detection`` 可使能检测功能 + + + 打开 ``Recognition`` 可使能识别功能(当然您在配置时使能了这个选项) + + .. figure:: ./img/example-result.png + :align: center + + .. + + + + + diff --git a/examples/camera_web_server/img/example-config.png b/examples/camera_web_server/img/example-config.png new file mode 100644 index 0000000..2f0cccc Binary files /dev/null and b/examples/camera_web_server/img/example-config.png differ diff --git a/examples/camera_web_server/img/example-result.png b/examples/camera_web_server/img/example-result.png new file mode 100644 index 0000000..ef2e572 Binary files /dev/null and b/examples/camera_web_server/img/example-result.png differ diff --git a/examples/camera_web_server/main/CMakeLists.txt b/examples/camera_web_server/main/CMakeLists.txt index e48fa10..1ae261a 100644 --- a/examples/camera_web_server/main/CMakeLists.txt +++ b/examples/camera_web_server/main/CMakeLists.txt @@ -1,9 +1,10 @@ -set(COMPONENT_SRCS "app_main.c" "app_wifi.c" "app_camera.c" "app_httpd.cpp" "app_mdns.c") +set(COMPONENT_SRCS "app_main.cpp" "app_wifi.c" "app_httpd.cpp" "app_mdns.c") set(COMPONENT_ADD_INCLUDEDIRS "include") set(COMPONENT_REQUIRES esp32-camera esp-dl + common nvs_flash esp_http_server fb_gfx diff --git a/examples/camera_web_server/main/Kconfig.projbuild b/examples/camera_web_server/main/Kconfig.projbuild index fecdbc4..ae74a6c 100644 --- a/examples/camera_web_server/main/Kconfig.projbuild +++ b/examples/camera_web_server/main/Kconfig.projbuild @@ -1,295 +1,57 @@ -menu "Camera Web Server" +menu "Example Configuration" -menu "WiFi Settings" -config ESP_HOST_NAME - string "Camera Host Name" - default "" - help - Hostname that the camera will advertise over mDNS. + config ESP_HOST_NAME + string "Camera Host Name" + default "" + help + Hostname that the camera will advertise over mDNS. -config ESP_WIFI_SSID - string "WiFi STA SSID" - default "" - help - WiFi SSID (network name) to connect to or empty for Off. + config ESP_WIFI_SSID + string "WiFi STA SSID" + default "" + help + WiFi SSID (network name) to connect to or empty for Off. -config ESP_WIFI_PASSWORD - string "WiFi STA Password" - default "" - help - WiFi Password if WEP/WPA/WPA2 or empty if Open. - -config ESP_WIFI_AP_SSID - string "WiFi AP SSID" - default "ESP32-Camera" - help - AP SSID (network name) to create or empty for Off. + config ESP_WIFI_PASSWORD + string "WiFi STA Password" + default "" + help + WiFi Password if WEP/WPA/WPA2 or empty if Open. + + config ESP_WIFI_AP_SSID + string "WiFi AP SSID" + default "ESP32-Camera" + help + AP SSID (network name) to create or empty for Off. -config ESP_WIFI_AP_PASSWORD - string "WiFi AP Password" - default "" - help - AP password for WPA2 or empty for Open. + config ESP_WIFI_AP_PASSWORD + string "WiFi AP Password" + default "" + help + AP password for WPA2 or empty for Open. -config MAX_STA_CONN - int "Maximal STA connections" - default 1 - help - Max number of the STA connects to AP. + config MAX_STA_CONN + int "Maximal STA connections" + default 1 + help + Max number of the STA connects to AP. -config ESP_WIFI_AP_CHANNEL - string "WiFi AP Channel" - default "" - help - AP channel for better connection performance. + config ESP_WIFI_AP_CHANNEL + string "WiFi AP Channel" + default "" + help + AP channel for better connection performance. -config SERVER_IP - string "WiFi AP IP Address" - default "192.168.4.1" - help - IP address that the ESP will assign to it's AP interface. You can use this IP to connect to the camera after flashing. + config SERVER_IP + string "WiFi AP IP Address" + default "192.168.4.1" + help + IP address that the ESP will assign to it's AP interface. You can use this IP to connect to the camera after flashing. -config ESP_MAXIMUM_RETRY - int "Maximum retry" - default 5 - help - Set the Maximum retry to avoid station reconnecting to the AP unlimited when the AP is really inexistent. -endmenu - -menu "LED Illuminator" -config LED_ILLUMINATOR_ENABLED - bool "LED Illuminator Enabled" - default n - help - Enable an LED Flash or IR Illuminator - -config LED_LEDC_PIN - depends on LED_ILLUMINATOR_ENABLED - int "LED Illuminator GPIO Pin" - range 0 33 - default 4 - help - Set a pin to illuminate an onboard LED or IR Illuminator when streaming or taking snapshots. - -config LED_MAX_INTENSITY - depends on LED_ILLUMINATOR_ENABLED - int "LED Maximum Intensity (0-255)" - range 0 255 - default 255 - help - Limit the maximum intensity of the LED while streaming to prevent overheating (0-255). - -choice LED_LEDC_SPEED_MODE - depends on LED_ILLUMINATOR_ENABLED - bool "Select LEDC Timer Speed Mode" - default LED_LEDC_LOW_SPEED_MODE - help - Select a speed mode for the LEDC channel - -config LED_LEDC_LOW_SPEED_MODE - bool "LOW_SPEED_MODE" -config LED_LEDC_HIGH_SPEED_MODE - bool "HIGH_SPEED_MODE" -endchoice - -config LED_LEDC_TIMER - depends on LED_ILLUMINATOR_ENABLED - int "LEDC Timer" - range 0 3 - default 1 - help - Select the LEDC Timer (0-3) - -config LED_LEDC_CHANNEL - depends on LED_ILLUMINATOR_ENABLED - int "LEDC Channel" - range 0 7 - default 1 - help - Select the LEDC Channel (0-7) -endmenu - -menu "Camera Pins" -choice CAMERA_MODEL - bool "Select Camera Pinout" - default CAMERA_MODEL_WROVER_KIT - help - Select Camera Pinout. - -config CAMERA_MODEL_WROVER_KIT - bool "WROVER-KIT With OV2640 Module" -config CAMERA_MODEL_ESP32_CAM_BOARD - bool "ESP32 Camera Development Board" -config CAMERA_MODEL_ESP_EYE - bool "ESP_EYE DevKit" -config CAMERA_MODEL_M5STACK_PSRAM - bool "M5Stack Camera With PSRAM" -config CAMERA_MODEL_M5STACK_WIDE - bool "M5Stack Camera F (Wide)" -config CAMERA_MODEL_AI_THINKER - bool "ESP32-CAM by AI-Thinker" -config CAMERA_MODEL_CUSTOM - bool "Custom Camera Pinout" -endchoice - -config CAMERA_PIN_PWDN - depends on CAMERA_MODEL_CUSTOM - int "Power Down pin" - range -1 33 - default -1 - help - Select Power Down pin or -1 for unmanaged. - -config CAMERA_PIN_RESET - depends on CAMERA_MODEL_CUSTOM - int "Reset pin" - range -1 33 - default -1 - help - Select Camera Reset pin or -1 for software reset. - -config CAMERA_PIN_XCLK - depends on CAMERA_MODEL_CUSTOM - int "XCLK pin" - range 0 33 - default 21 - help - Select Camera XCLK pin. - -config CAMERA_PIN_SIOD - depends on CAMERA_MODEL_CUSTOM - int "SIOD pin" - range 0 33 - default 26 - help - Select Camera SIOD pin. - -config CAMERA_PIN_SIOC - depends on CAMERA_MODEL_CUSTOM - int "SIOC pin" - range 0 33 - default 27 - help - Select Camera SIOC pin. - -config CAMERA_PIN_VSYNC - depends on CAMERA_MODEL_CUSTOM - int "VSYNC pin" - range 0 39 - default 25 - help - Select Camera VSYNC pin. - -config CAMERA_PIN_HREF - depends on CAMERA_MODEL_CUSTOM - int "HREF pin" - range 0 39 - default 23 - help - Select Camera HREF pin. - -config CAMERA_PIN_PCLK - depends on CAMERA_MODEL_CUSTOM - int "PCLK pin" - range 0 39 - default 25 - help - Select Camera PCLK pin. - -config CAMERA_PIN_Y2 - depends on CAMERA_MODEL_CUSTOM - int "Y2 pin" - range 0 39 - default 4 - help - Select Camera Y2 pin. - -config CAMERA_PIN_Y3 - depends on CAMERA_MODEL_CUSTOM - int "Y3 pin" - range 0 39 - default 5 - help - Select Camera Y3 pin. - -config CAMERA_PIN_Y4 - depends on CAMERA_MODEL_CUSTOM - int "Y4 pin" - range 0 39 - default 18 - help - Select Camera Y4 pin. - -config CAMERA_PIN_Y5 - depends on CAMERA_MODEL_CUSTOM - int "Y5 pin" - range 0 39 - default 19 - help - Select Camera Y5 pin. - -config CAMERA_PIN_Y6 - depends on CAMERA_MODEL_CUSTOM - int "Y6 pin" - range 0 39 - default 36 - help - Select Camera Y6 pin. - -config CAMERA_PIN_Y7 - depends on CAMERA_MODEL_CUSTOM - int "Y7 pin" - range 0 39 - default 39 - help - Select Camera Y7 pin. - -config CAMERA_PIN_Y8 - depends on CAMERA_MODEL_CUSTOM - int "Y8 pin" - range 0 39 - default 34 - help - Select Camera Y8 pin. - -config CAMERA_PIN_Y9 - depends on CAMERA_MODEL_CUSTOM - int "Y9 pin" - range 0 39 - default 35 - help - Select Camera Y9 pin. - -endmenu - - - - menu "DL Configuration" - - config DL_DETECT_ENABLED - bool "Enable Detection" - default n - - choice DL_DETECT_TARGET - bool "Select Detection Model" - depends on DL_DETECT_ENABLED - default DL_DETECT_HUMAN_FACE - - config DL_DETECT_HUMAN_FACE - bool "Human Face Detection Model" - config DL_DETECT_CAT_FACE - bool "Cat Face Detection Model" - endchoice - - config DL_DETECT_HUMAN_FACE_WITH_KEYPOINT - bool "Enable Human Face Keypoint Detection" - default n - depends on DL_DETECT_HUMAN_FACE - - config DL_RECOGNIZE_HUMAN_FACE - bool "Enable Human Face Recognition" - depends on DL_DETECT_HUMAN_FACE_WITH_KEYPOINT - default n - endmenu + config ESP_MAXIMUM_RETRY + int "Maximum retry" + default 5 + help + Set the Maximum retry to avoid station reconnecting to the AP unlimited when the AP is really inexistent. endmenu diff --git a/examples/camera_web_server/main/app_camera.c b/examples/camera_web_server/main/app_camera.c deleted file mode 100755 index 54b1de0..0000000 --- a/examples/camera_web_server/main/app_camera.c +++ /dev/null @@ -1,120 +0,0 @@ -/* ESPRESSIF MIT License - * - * Copyright (c) 2018 - * - * Permission is hereby granted for use on all ESPRESSIF SYSTEMS products, in which case, - * it is free of charge, to any person obtaining a copy of this software and associated - * documentation files (the "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all copies or - * substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -#include "esp_log.h" -#include "driver/ledc.h" -#include "esp_camera.h" -#include "app_camera.h" -#include "sdkconfig.h" - - -static const char *TAG = "app_camera"; - -void app_camera_main () -{ -#if CONFIG_CAMERA_MODEL_ESP_EYE || CONFIG_CAMERA_MODEL_ESP32_CAM_BOARD - /* IO13, IO14 is designed for JTAG by default, - * to use it as generalized input, - * firstly declair it as pullup input */ - gpio_config_t conf; - conf.mode = GPIO_MODE_INPUT; - conf.pull_up_en = GPIO_PULLUP_ENABLE; - conf.pull_down_en = GPIO_PULLDOWN_DISABLE; - conf.intr_type = GPIO_INTR_DISABLE; - conf.pin_bit_mask = 1LL << 13; - gpio_config(&conf); - conf.pin_bit_mask = 1LL << 14; - gpio_config(&conf); -#endif - -#ifdef CONFIG_LED_ILLUMINATOR_ENABLED - gpio_set_direction(CONFIG_LED_LEDC_PIN,GPIO_MODE_OUTPUT); - ledc_timer_config_t ledc_timer = { - .duty_resolution = LEDC_TIMER_8_BIT, // resolution of PWM duty - .freq_hz = 1000, // frequency of PWM signal - .speed_mode = LEDC_LOW_SPEED_MODE, // timer mode - .timer_num = CONFIG_LED_LEDC_TIMER // timer index - }; - ledc_channel_config_t ledc_channel = { - .channel = CONFIG_LED_LEDC_CHANNEL, - .duty = 0, - .gpio_num = CONFIG_LED_LEDC_PIN, - .speed_mode = LEDC_LOW_SPEED_MODE, - .hpoint = 0, - .timer_sel = CONFIG_LED_LEDC_TIMER - }; - #ifdef CONFIG_LED_LEDC_HIGH_SPEED_MODE - ledc_timer.speed_mode = ledc_channel.speed_mode = LEDC_HIGH_SPEED_MODE; - #endif - switch (ledc_timer_config(&ledc_timer)) { - case ESP_ERR_INVALID_ARG: ESP_LOGE(TAG, "ledc_timer_config() parameter error"); break; - case ESP_FAIL: ESP_LOGE(TAG, "ledc_timer_config() Can not find a proper pre-divider number base on the given frequency and the current duty_resolution"); break; - case ESP_OK: if (ledc_channel_config(&ledc_channel) == ESP_ERR_INVALID_ARG) { - ESP_LOGE(TAG, "ledc_channel_config() parameter error"); - } - break; - default: break; - } -#endif - - camera_config_t config; - config.ledc_channel = LEDC_CHANNEL_0; - config.ledc_timer = LEDC_TIMER_0; - config.pin_d0 = Y2_GPIO_NUM; - config.pin_d1 = Y3_GPIO_NUM; - config.pin_d2 = Y4_GPIO_NUM; - config.pin_d3 = Y5_GPIO_NUM; - config.pin_d4 = Y6_GPIO_NUM; - config.pin_d5 = Y7_GPIO_NUM; - config.pin_d6 = Y8_GPIO_NUM; - config.pin_d7 = Y9_GPIO_NUM; - config.pin_xclk = XCLK_GPIO_NUM; - config.pin_pclk = PCLK_GPIO_NUM; - config.pin_vsync = VSYNC_GPIO_NUM; - config.pin_href = HREF_GPIO_NUM; - config.pin_sscb_sda = SIOD_GPIO_NUM; - config.pin_sscb_scl = SIOC_GPIO_NUM; - config.pin_pwdn = PWDN_GPIO_NUM; - config.pin_reset = RESET_GPIO_NUM; - config.xclk_freq_hz = 20000000; - config.pixel_format = PIXFORMAT_JPEG; - //init with high specs to pre-allocate larger buffers - config.frame_size = FRAMESIZE_QSXGA; - config.jpeg_quality = 10; - config.fb_count = 1; - - // camera init - esp_err_t err = esp_camera_init(&config); - if (err != ESP_OK) { - ESP_LOGE(TAG, "Camera init failed with error 0x%x", err); - return; - } - - sensor_t * s = esp_camera_sensor_get(); - s->set_vflip(s, 1);//flip it back - //initial sensors are flipped vertically and colors are a bit saturated - if (s->id.PID == OV3660_PID) { - s->set_brightness(s, 1);//up the blightness just a bit - s->set_saturation(s, -2);//lower the saturation - } - //drop down frame size for higher initial frame rate - s->set_framesize(s, FRAMESIZE_HD); -} diff --git a/examples/camera_web_server/main/app_httpd.cpp b/examples/camera_web_server/main/app_httpd.cpp index b051dd6..0269f40 100644 --- a/examples/camera_web_server/main/app_httpd.cpp +++ b/examples/camera_web_server/main/app_httpd.cpp @@ -12,16 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "app_httpd.h" +#include "app_httpd.hpp" + +#include #include "esp_http_server.h" #include "esp_timer.h" -#include "esp_camera.h" #include "img_converters.h" #include "fb_gfx.h" -#include "driver/ledc.h" -#include "sdkconfig.h" #include "app_mdns.h" -#include "app_camera.h" +#include "app_camera.hpp" +#include "app_common.hpp" +#include "sdkconfig.h" #include "dl_tool.hpp" #if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG) @@ -32,44 +33,29 @@ static const char *TAG = "camera_httpd"; #endif -#if CONFIG_DL_DETECT_ENABLED -#include -#include "dl_image.hpp" -#include "dl_detect_define.hpp" - -#define RGB888_RED 0x0000FF -#define RGB888_GREEN 0x00FF00 -#define RGB888_BLUE 0xFF0000 - -static int8_t detection_enabled = 0; -#endif - -#if CONFIG_DL_DETECT_HUMAN_FACE +#if CONFIG_DL_HUMAN_FACE_DETECTION_S1_MSR01 #include "human_face_detect_msr01.hpp" #endif -#if CONFIG_DL_DETECT_HUMAN_FACE_WITH_KEYPOINT +#if CONFIG_DL_HUMAN_FACE_DETECTION_S2_MNP01 #include "human_face_detect_mnp01.hpp" #endif -#if CONFIG_DL_DETECT_CAT_FACE +#if CONFIG_DL_CAT_FACE_DETECTION_MN03 #include "cat_face_detect_mn03.hpp" #endif -#if CONFIG_DL_RECOGNIZE_HUMAN_FACE +#if CONFIG_DL_HUMAN_FACE_RECOGNITION_XXX // TODO: recognize human face -static int8_t recognition_enabled = 0; -static int8_t is_enrolling = 0; #endif +static int8_t detection_enabled = 0; +static int8_t recognition_enabled = 0; +static int8_t is_enrolling = 0; + #ifdef CONFIG_LED_ILLUMINATOR_ENABLED +#include "app_led.h" int led_duty = 0; -bool isStreaming = false; -#ifdef CONFIG_LED_LEDC_LOW_SPEED_MODE -#define CONFIG_LED_LEDC_SPEED_MODE LEDC_LOW_SPEED_MODE -#else -#define CONFIG_LED_LEDC_SPEED_MODE LEDC_HIGH_SPEED_MODE -#endif #endif typedef struct @@ -86,20 +72,6 @@ static const char *_STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: % httpd_handle_t stream_httpd = NULL; httpd_handle_t camera_httpd = NULL; -#ifdef CONFIG_LED_ILLUMINATOR_ENABLED -void enable_led(bool en) -{ // Turn LED On or Off - int duty = en ? led_duty : 0; - if (en && isStreaming && (led_duty > CONFIG_LED_MAX_INTENSITY)) - { - duty = CONFIG_LED_MAX_INTENSITY; - } - ledc_set_duty(CONFIG_LED_LEDC_SPEED_MODE, CONFIG_LED_LEDC_CHANNEL, duty); - ledc_update_duty(CONFIG_LED_LEDC_SPEED_MODE, CONFIG_LED_LEDC_CHANNEL); - ESP_LOGI(TAG, "Set LED intensity to %d", duty); -} -#endif - static size_t jpg_encode_stream(void *arg, size_t index, const void *data, size_t len) { jpg_chunking_t *j = (jpg_chunking_t *)arg; @@ -124,10 +96,10 @@ static esp_err_t capture_handler(httpd_req_t *req) esp_err_t res = ESP_OK; #ifdef CONFIG_LED_ILLUMINATOR_ENABLED - enable_led(true); + app_led_duty(led_duty); vTaskDelay(150 / portTICK_PERIOD_MS); // The LED needs to be turned on ~150ms before the call to esp_camera_fb_get() fb = esp_camera_fb_get(); // or it won't be visible in the frame. A better way to do this is needed. - enable_led(false); + app_led_duty(0); #else fb = esp_camera_fb_get(); #endif @@ -177,28 +149,32 @@ static esp_err_t stream_handler(httpd_req_t *req) char *part_buf[128]; dl::tool::Latency latency_total(24); -#if CONFIG_DL_DETECT_ENABLED - uint8_t *image_rgb888 = NULL; + IMAGE_T *image_ptr = NULL; + bool is_detected = false; + + dl::tool::Latency latency_fetch; dl::tool::Latency latency_decode; dl::tool::Latency latency_encode; dl::tool::Latency latency_detect; -#endif + dl::tool::Latency latency_recognize; -#if CONFIG_DL_DETECT_HUMAN_FACE +#if CONFIG_DL_HUMAN_FACE +#if CONFIG_DL_HUMAN_FACE_DETECTION_S1_MSR01 HumanFaceDetectMSR01 detector(0.3F, 0.3F, 10, 0.3F); #endif -#if CONFIG_DL_DETECT_HUMAN_FACE_WITH_KEYPOINT +#if CONFIG_DL_HUMAN_FACE_DETECTION_S2_MNP01 HumanFaceDetectMNP01 detector2(0.4F, 0.3F, 10); #endif - -#if CONFIG_DL_DETECT_CAT_FACE - CatFaceDetectMN03 detector(0.4F, 0.3F, 10, 0.3F); +#if CONFIG_DL_HUMAN_FACE_RECOGNITION_XXX +// TODO: recognize human face +#endif #endif -#if CONFIG_DL_RECOGNIZE_HUMAN_FACE - dl::tool::Latency latency_recognize; -// TODO: recognize human face +#if CONFIG_DL_CAT_FACE +#if CONFIG_DL_CAT_FACE_DETECTION_MN03 + CatFaceDetectMN03 detector(0.4F, 0.3F, 10, 0.3F); +#endif #endif res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE); @@ -211,133 +187,150 @@ static esp_err_t stream_handler(httpd_req_t *req) httpd_resp_set_hdr(req, "X-Framerate", "60"); #ifdef CONFIG_LED_ILLUMINATOR_ENABLED - enable_led(true); - isStreaming = true; + app_led_duty(led_duty); #endif while (true) { - latency_total.start(); - fb = esp_camera_fb_get(); - if (!fb) - { - ESP_LOGE(TAG, "Camera capture failed"); - res = ESP_FAIL; - } - else + latency_fetch.clear_period(); + latency_decode.clear_period(); + latency_encode.clear_period(); + + latency_detect.clear_period(); + latency_recognize.clear_period(); + + image_ptr = NULL; + is_detected = false; + + do { + latency_total.start(); + + latency_fetch.start(); + fb = esp_camera_fb_get(); + if (!fb) + { + ESP_LOGE(TAG, "Camera capture failed"); + res = ESP_FAIL; + break; + } _timestamp.tv_sec = fb->timestamp.tv_sec; _timestamp.tv_usec = fb->timestamp.tv_usec; -#if CONFIG_DL_DETECT_ENABLED - if (!detection_enabled || fb->width > 400) + latency_fetch.end(); + +#if CONFIG_DL_ENABLED + if (detection_enabled && fb->width < 400) { + latency_decode.start(); + if (app_camera_decode(fb, &image_ptr) == false) + { + res = ESP_FAIL; + break; + } + latency_decode.end(); + +#if CONFIG_DL_HUMAN_FACE + latency_detect.start(); +#if CONFIG_DL_HUMAN_FACE_DETECTION_S2_ENABLED + std::list &detect_candidates = detector.infer((IMAGE_T *)image_ptr, {(int)fb->height, (int)fb->width, 3}); + std::list &detect_results = detector2.infer((IMAGE_T *)image_ptr, {(int)fb->height, (int)fb->width, 3}, detect_candidates); +#else + std::list &detect_results = detector.infer((IMAGE_T *)image_ptr, {(int)fb->height, (int)fb->width, 3}); #endif - if (fb->format != PIXFORMAT_JPEG) + latency_detect.end(); + + if (detect_results.size() > 0) { - bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len); - esp_camera_fb_return(fb); - fb = NULL; - if (!jpeg_converted) + is_detected = true; + draw_detection_result((IMAGE_T*)image_ptr, fb->height, fb->width, detect_results); + + latency_recognize.start(); + if (recognition_enabled) { - ESP_LOGE(TAG, "JPEG compression failed"); - res = ESP_FAIL; +#if CONFIG_DL_HUMAN_FACE_RECOGNITION_XXX + // TODO: recognize human face +#endif } + latency_recognize.end(); } - else +#endif // CONFIG_DL_HUMAN_FACE + +#if CONFIG_DL_CAT_FACE + latency_detect.start(); + std::list &detect_results = detector.infer((IMAGE_T *)image_ptr, {(int)fb->height, (int)fb->width, 3}); + latency_detect.end(); + if (detect_results.size() > 0) { - _jpg_buf_len = fb->len; - _jpg_buf = fb->buf; + is_detected = true; + draw_detection_result((IMAGE_T*)image_ptr, fb->height, fb->width, detect_results); } -#if CONFIG_DL_DETECT_ENABLED +#endif // CONFIG_DL_CAT_FACE + +#if CONFIG_DL_HUMAN_HAND + latency_detect.start(); + // TODO: + latency_detect.end(); +#endif // CONFIG_DL_HUMAN_HAND + } +#endif // CONFIG_DL_ENABLED + + latency_encode.start(); + if (is_detected) + { +#if CONFIG_CAMERA_PIXEL_FORMAT_RGB565 + if (!fmt2jpg((uint8_t *)image_ptr, fb->width * fb->height * 3, fb->width, fb->height, PIXFORMAT_RGB565, 90, &_jpg_buf, &_jpg_buf_len)) +#else + if (!fmt2jpg((uint8_t *)image_ptr, fb->width * fb->height * 3, fb->width, fb->height, PIXFORMAT_RGB888, 90, &_jpg_buf, &_jpg_buf_len)) +#endif + { + ESP_LOGE(TAG, "fmt2jpg failed"); + res = ESP_FAIL; + break; + } + + esp_camera_fb_return(fb); + fb = NULL; + } + else if (fb->format == PIXFORMAT_JPEG) + { + _jpg_buf = fb->buf; + _jpg_buf_len = fb->len; } else { - image_rgb888 = (uint8_t *)dl::tool::malloc_aligned(fb->height * fb->width * 3, sizeof(uint8_t)); - - if (!image_rgb888) + if (!frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len)) { - ESP_LOGE(TAG, "dl_matrix3du_alloc failed"); + ESP_LOGE(TAG, "JPEG compression failed"); res = ESP_FAIL; + break; } - else - { - latency_decode.start(); - if (!fmt2rgb888(fb->buf, fb->len, fb->format, image_rgb888)) - { - ESP_LOGE(TAG, "fmt2rgb888 failed"); - res = ESP_FAIL; - } - else - { - latency_decode.end(); - latency_detect.start(); -#if CONFIG_DL_DETECT_HUMAN_FACE_WITH_KEYPOINT - std::list &candidates = detector.infer((uint8_t *)image_rgb888, {(int)fb->height, (int)fb->width, 3}); - std::list &results = detector2.infer((uint8_t *)image_rgb888, {(int)fb->height, (int)fb->width, 3}, candidates); -#else - std::list &results = detector.infer((uint8_t *)image_rgb888, {(int)fb->height, (int)fb->width, 3}); -#endif - latency_detect.end(); - if (results.size() > 0 || fb->format != PIXFORMAT_JPEG) - { - int i = 0; - for (std::list::iterator prediction = results.begin(); prediction != results.end(); prediction++, i++) - { - dl::image::draw_hollow_rectangle(image_rgb888, fb->height, fb->width, - DL_MAX(prediction->box[0], 0), - DL_MAX(prediction->box[1], 0), - DL_MAX(prediction->box[2], 0), - DL_MAX(prediction->box[3], 0), - RGB888_GREEN); -#if CONFIG_DL_DETECT_HUMAN_FACE_WITH_KEYPOINT - dl::image::draw_point(image_rgb888, fb->height, fb->width, DL_MAX(prediction->keypoint[0], 0), DL_MAX(prediction->keypoint[1], 0), 4, RGB888_RED); // left eye - dl::image::draw_point(image_rgb888, fb->height, fb->width, DL_MAX(prediction->keypoint[2], 0), DL_MAX(prediction->keypoint[3], 0), 4, RGB888_RED); // mouth left corner - dl::image::draw_point(image_rgb888, fb->height, fb->width, DL_MAX(prediction->keypoint[4], 0), DL_MAX(prediction->keypoint[5], 0), 4, RGB888_GREEN); // nose - dl::image::draw_point(image_rgb888, fb->height, fb->width, DL_MAX(prediction->keypoint[6], 0), DL_MAX(prediction->keypoint[7], 0), 4, RGB888_BLUE); // right eye - dl::image::draw_point(image_rgb888, fb->height, fb->width, DL_MAX(prediction->keypoint[8], 0), DL_MAX(prediction->keypoint[9], 0), 4, RGB888_BLUE); // mouth right corner -#endif - } - -#if CONFIG_DL_RECOGNIZE_HUMAN_FACE - latency_recognize.start(); - // TODO: recognize human face - latency_recognize.end(); -#endif - - latency_encode.start(); - if (!fmt2jpg(image_rgb888, fb->width * fb->height * 3, fb->width, fb->height, PIXFORMAT_RGB888, 90, &_jpg_buf, &_jpg_buf_len)) - { - ESP_LOGE(TAG, "fmt2jpg failed"); - } - esp_camera_fb_return(fb); - fb = NULL; - latency_encode.end(); - } - else - { - _jpg_buf = fb->buf; - _jpg_buf_len = fb->len; - } - } - dl::tool::free_aligned(image_rgb888); - } + esp_camera_fb_return(fb); + fb = NULL; } + latency_encode.end(); + +#if !CONFIG_CAMERA_PIXEL_FORMAT_RGB565 + dl::tool::free_aligned(image_ptr); #endif - } + } while (0); + 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, 128, _STREAM_PART, _jpg_buf_len, _timestamp.tv_sec, _timestamp.tv_usec); 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); @@ -349,47 +342,27 @@ static esp_err_t stream_handler(httpd_req_t *req) free(_jpg_buf); _jpg_buf = NULL; } + if (res != ESP_OK) { break; } - latency_total.end(); + latency_total.end(); uint32_t frame_latency = latency_total.get_period() / 1000; uint32_t average_frame_latency = latency_total.get_average_period() / 1000; -#if CONFIG_DL_RECOGNIZE_HUMAN_FACE - if (recognition_enabled) - { - ESP_LOGI(TAG, "Frame: %4ums (%.1ffps), Average: %4ums (%.1ffps) | decode: %4ums, detect: %4ums, recognize: %5ums, encode: %4ums", - frame_latency, 1000.0 / frame_latency, average_frame_latency, 1000.0 / average_frame_latency, - latency_decode.get_period() / 1000, - latency_detect.get_period() / 1000, - latency_recognize.get_period() / 1000, - latency_encode.get_period() / 1000); - } - else -#endif -#if CONFIG_DL_DETECT_ENABLED - if (detection_enabled) - { - ESP_LOGI(TAG, "Frame: %4ums (%.1ffps), Average: %4ums (%.1ffps) | decode: %4ums, detect: %4ums, encode: %4ums", - frame_latency, 1000.0 / frame_latency, average_frame_latency, 1000.0 / average_frame_latency, - latency_decode.get_period() / 1000, - latency_detect.get_period() / 1000, - latency_encode.get_period() / 1000); - } - else -#endif - { - ESP_LOGI(TAG, "Frame: %4ums (%.1ffps), Average: %4ums (%.1ffps)", - frame_latency, 1000.0 / frame_latency, average_frame_latency, 1000.0 / average_frame_latency); - } + ESP_LOGI(TAG, "Frame: %4ums (%2.1ffps), Average: %4ums (%2.1ffps) | fetch %4ums, decode: %4ums, detect: %4ums, recognize: %5ums, encode: %4ums", + frame_latency, 1000.0 / frame_latency, average_frame_latency, 1000.0 / average_frame_latency, + latency_fetch.get_period() / 1000, + latency_decode.get_period() / 1000, + latency_detect.get_period() / 1000, + latency_recognize.get_period() / 1000, + latency_encode.get_period() / 1000); } #ifdef CONFIG_LED_ILLUMINATOR_ENABLED - isStreaming = false; - enable_led(false); + app_led_duty(0); #endif return res; @@ -500,25 +473,17 @@ static esp_err_t cmd_handler(httpd_req_t *req) res = s->set_ae_level(s, val); #ifdef CONFIG_LED_ILLUMINATOR_ENABLED else if (!strcmp(variable, "led_intensity")) - { led_duty = val; - if (isStreaming) - enable_led(true); - } #endif -#if CONFIG_DL_DETECT_ENABLED else if (!strcmp(variable, "face_detect")) { detection_enabled = val; -#if CONFIG_DL_RECOGNIZE_HUMAN_FACE if (!detection_enabled) { recognition_enabled = 0; } -#endif } -#if CONFIG_DL_RECOGNIZE_HUMAN_FACE else if (!strcmp(variable, "face_enroll")) is_enrolling = val; else if (!strcmp(variable, "face_recognize")) @@ -529,8 +494,6 @@ static esp_err_t cmd_handler(httpd_req_t *req) detection_enabled = val; } } -#endif -#endif else { res = -1; @@ -594,7 +557,7 @@ static esp_err_t status_handler(httpd_req_t *req) p += print_reg(p, s, 0x132, 0xFF); } - p += sprintf(p, "\"board\":\"%s\",", CAM_BOARD); + p += sprintf(p, "\"board\":\"%s\",", CAMERA_MODULE_NAME); p += sprintf(p, "\"xclk\":%u,", s->xclk_freq_hz / 1000000); p += sprintf(p, "\"pixformat\":%u,", s->pixformat); p += sprintf(p, "\"framesize\":%u,", s->status.framesize); @@ -626,13 +589,9 @@ static esp_err_t status_handler(httpd_req_t *req) #else p += sprintf(p, ",\"led_intensity\":%d", -1); #endif -#if CONFIG_DL_DETECT_ENABLED p += sprintf(p, ",\"face_detect\":%u", detection_enabled); -#if CONFIG_DL_RECOGNIZE_HUMAN_FACE p += sprintf(p, ",\"face_enroll\":%u,", is_enrolling); p += sprintf(p, "\"face_recognize\":%u", recognition_enabled); -#endif -#endif *p++ = '}'; *p++ = 0; httpd_resp_set_type(req, "application/json"); diff --git a/examples/camera_web_server/main/app_main.c b/examples/camera_web_server/main/app_main.c deleted file mode 100755 index ed67ee4..0000000 --- a/examples/camera_web_server/main/app_main.c +++ /dev/null @@ -1,34 +0,0 @@ -/* ESPRESSIF MIT License - * - * Copyright (c) 2018 - * - * Permission is hereby granted for use on all ESPRESSIF SYSTEMS products, in which case, - * it is free of charge, to any person obtaining a copy of this software and associated - * documentation files (the "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all copies or - * substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "app_camera.h" -#include "app_wifi.h" -#include "app_httpd.h" -#include "app_mdns.h" - -void app_main() -{ - app_wifi_main(); - app_camera_main(); - app_httpd_main(); - app_mdns_main(); -} diff --git a/examples/camera_web_server/main/app_main.cpp b/examples/camera_web_server/main/app_main.cpp new file mode 100755 index 0000000..98d117d --- /dev/null +++ b/examples/camera_web_server/main/app_main.cpp @@ -0,0 +1,24 @@ +#include "app_camera.hpp" +#include "app_wifi.h" +#include "app_httpd.hpp" +#include "app_mdns.h" +#if CONFIG_LED_ILLUMINATOR_ENABLED +#include "app_led.h" +#endif + +extern "C" void app_main() +{ + app_wifi_main(); + +#if CONFIG_CAMERA_PIXEL_FORMAT_RGB565 + app_camera_init(FRAMESIZE_QVGA, 12, 2); +#else + app_camera_init(FRAMESIZE_UXGA, 12, 2); +#endif + +#if CONFIG_LED_ILLUMINATOR_ENABLED + app_led_init(); +#endif + app_httpd_main(); + app_mdns_main(); +} diff --git a/examples/camera_web_server/main/app_mdns.c b/examples/camera_web_server/main/app_mdns.c index 17449aa..41aafc7 100644 --- a/examples/camera_web_server/main/app_mdns.c +++ b/examples/camera_web_server/main/app_mdns.c @@ -30,7 +30,7 @@ #include "esp_wifi.h" #include "esp_camera.h" #include "mdns.h" -#include "app_camera.h" +#include "app_define.h" static const char *TAG = "camera mdns"; @@ -96,7 +96,7 @@ const char * app_mdns_query(size_t * out_len) p += sprintf(p, "\"pixformat\":\"%s\",", pixformat); p += sprintf(p, "\"framesize\":\"%s\",", framesize); p += sprintf(p, "\"stream_port\":\"81\","); - p += sprintf(p, "\"board\":\"%s\",", CAM_BOARD); + p += sprintf(p, "\"board\":\"%s\",", CAMERA_MODULE_NAME); p += sprintf(p, "\"model\":\"%s\"", model); *p++ = '}'; *p++ = ','; @@ -196,7 +196,7 @@ void app_mdns_main() ESP_LOGE(TAG, "esp_read_mac() Failed"); return; } - snprintf(iname, 64, "%s-%s-%02X%02X%02X", CAM_BOARD, model, mac[3], mac[4], mac[5]); + snprintf(iname, 64, "%s-%s-%02X%02X%02X", CAMERA_MODULE_NAME, model, mac[3], mac[4], mac[5]); } snprintf(framesize, 4, "%d", s->status.framesize); @@ -234,7 +234,7 @@ void app_mdns_main() mdns_txt_item_t camera_txt_data[] = { - {(char*)"board" ,(char*)CAM_BOARD}, + {(char*)"board" ,(char*)CAMERA_MODULE_NAME}, {(char*)"model" ,(char*)model}, {(char*)"stream_port" ,(char*)"81"}, {(char*)"framesize" ,(char*)framesize}, diff --git a/examples/camera_web_server/main/app_wifi.c b/examples/camera_web_server/main/app_wifi.c index df65f85..9a6a5bb 100644 --- a/examples/camera_web_server/main/app_wifi.c +++ b/examples/camera_web_server/main/app_wifi.c @@ -40,13 +40,13 @@ If you'd rather not, just change the below entries to strings with the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid" */ -#define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID -#define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD -#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY -#define EXAMPLE_ESP_WIFI_AP_SSID CONFIG_ESP_WIFI_AP_SSID -#define EXAMPLE_ESP_WIFI_AP_PASS CONFIG_ESP_WIFI_AP_PASSWORD -#define EXAMPLE_MAX_STA_CONN CONFIG_MAX_STA_CONN -#define EXAMPLE_IP_ADDR CONFIG_SERVER_IP +#define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID +#define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD +#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY +#define EXAMPLE_ESP_WIFI_AP_SSID CONFIG_ESP_WIFI_AP_SSID +#define EXAMPLE_ESP_WIFI_AP_PASS CONFIG_ESP_WIFI_AP_PASSWORD +#define EXAMPLE_MAX_STA_CONN CONFIG_MAX_STA_CONN +#define EXAMPLE_IP_ADDR CONFIG_SERVER_IP #define EXAMPLE_ESP_WIFI_AP_CHANNEL CONFIG_ESP_WIFI_AP_CHANNEL static const char *TAG = "camera wifi"; @@ -55,7 +55,8 @@ static int s_retry_num = 0; static esp_err_t event_handler(void *ctx, system_event_t *event) { - switch(event->event_id) { + switch (event->event_id) + { case SYSTEM_EVENT_AP_STACONNECTED: ESP_LOGI(TAG, "station:" MACSTR " join, AID=%d", MAC2STR(event->event_info.sta_connected.mac), @@ -75,15 +76,16 @@ static esp_err_t event_handler(void *ctx, system_event_t *event) s_retry_num = 0; break; case SYSTEM_EVENT_STA_DISCONNECTED: + { + if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) { - if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) { - esp_wifi_connect(); - s_retry_num++; - ESP_LOGI(TAG,"retry to connect to the AP"); - } - ESP_LOGI(TAG,"connect to the AP fail"); - break; + esp_wifi_connect(); + s_retry_num++; + ESP_LOGI(TAG, "retry to connect to the AP"); } + ESP_LOGI(TAG, "connect to the AP fail"); + break; + } default: break; } @@ -107,15 +109,17 @@ void wifi_init_softap() } wifi_config_t wifi_config; memset(&wifi_config, 0, sizeof(wifi_config_t)); - snprintf((char*)wifi_config.ap.ssid, 32, "%s", EXAMPLE_ESP_WIFI_AP_SSID); - wifi_config.ap.ssid_len = strlen((char*)wifi_config.ap.ssid); - snprintf((char*)wifi_config.ap.password, 64, "%s", EXAMPLE_ESP_WIFI_AP_PASS); + snprintf((char *)wifi_config.ap.ssid, 32, "%s", EXAMPLE_ESP_WIFI_AP_SSID); + wifi_config.ap.ssid_len = strlen((char *)wifi_config.ap.ssid); + snprintf((char *)wifi_config.ap.password, 64, "%s", EXAMPLE_ESP_WIFI_AP_PASS); wifi_config.ap.max_connection = EXAMPLE_MAX_STA_CONN; wifi_config.ap.authmode = WIFI_AUTH_WPA_WPA2_PSK; - if (strlen(EXAMPLE_ESP_WIFI_AP_PASS) == 0) { + if (strlen(EXAMPLE_ESP_WIFI_AP_PASS) == 0) + { wifi_config.ap.authmode = WIFI_AUTH_OPEN; } - if (strlen(EXAMPLE_ESP_WIFI_AP_CHANNEL)) { + if (strlen(EXAMPLE_ESP_WIFI_AP_CHANNEL)) + { int channel; sscanf(EXAMPLE_ESP_WIFI_AP_CHANNEL, "%d", &channel); wifi_config.ap.channel = channel; @@ -131,10 +135,10 @@ void wifi_init_sta() { wifi_config_t wifi_config; memset(&wifi_config, 0, sizeof(wifi_config_t)); - snprintf((char*)wifi_config.sta.ssid, 32, "%s", EXAMPLE_ESP_WIFI_SSID); - snprintf((char*)wifi_config.sta.password, 64, "%s", EXAMPLE_ESP_WIFI_PASS); + snprintf((char *)wifi_config.sta.ssid, 32, "%s", EXAMPLE_ESP_WIFI_SSID); + snprintf((char *)wifi_config.sta.password, 64, "%s", EXAMPLE_ESP_WIFI_PASS); - ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) ); + ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)); ESP_LOGI(TAG, "wifi_init_sta finished."); ESP_LOGI(TAG, "connect to ap SSID:%s password:%s", @@ -146,23 +150,30 @@ void app_wifi_main() wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); wifi_mode_t mode = WIFI_MODE_NULL; - if (strlen(EXAMPLE_ESP_WIFI_AP_SSID) && strlen(EXAMPLE_ESP_WIFI_SSID)) { + if (strlen(EXAMPLE_ESP_WIFI_AP_SSID) && strlen(EXAMPLE_ESP_WIFI_SSID)) + { mode = WIFI_MODE_APSTA; - } else if (strlen(EXAMPLE_ESP_WIFI_AP_SSID)) { + } + else if (strlen(EXAMPLE_ESP_WIFI_AP_SSID)) + { mode = WIFI_MODE_AP; - } else if (strlen(EXAMPLE_ESP_WIFI_SSID)) { + } + else if (strlen(EXAMPLE_ESP_WIFI_SSID)) + { mode = WIFI_MODE_STA; } esp_err_t ret = nvs_flash_init(); - if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { - ESP_ERROR_CHECK(nvs_flash_erase()); - ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); - if (mode == WIFI_MODE_NULL) { - ESP_LOGW(TAG,"Neither AP or STA have been configured. WiFi will be off."); + if (mode == WIFI_MODE_NULL) + { + ESP_LOGW(TAG, "Neither AP or STA have been configured. WiFi will be off."); return; } @@ -171,11 +182,13 @@ void app_wifi_main() ESP_ERROR_CHECK(esp_wifi_init(&cfg)); ESP_ERROR_CHECK(esp_wifi_set_mode(mode)); - if (mode & WIFI_MODE_AP) { + if (mode & WIFI_MODE_AP) + { wifi_init_softap(); } - if (mode & WIFI_MODE_STA) { + if (mode & WIFI_MODE_STA) + { wifi_init_sta(); } ESP_ERROR_CHECK(esp_wifi_start()); diff --git a/examples/camera_web_server/main/component.mk b/examples/camera_web_server/main/component.mk deleted file mode 100644 index 5557b3e..0000000 --- a/examples/camera_web_server/main/component.mk +++ /dev/null @@ -1,12 +0,0 @@ -# -# Main Makefile. This is basically the same as a component makefile. -# -# This Makefile should, at the very least, just include $(SDK_PATH)/make/component.mk. By default, -# this will take the sources in the src/ directory, compile them and link them into -# lib(subdirectory_name).a in the build directory. This behaviour is entirely configurable, -# please read the SDK documents if you need to do this. -# -COMPONENT_EMBED_FILES := www/index_ov2640.html.gz -COMPONENT_EMBED_FILES += www/index_ov3660.html.gz -COMPONENT_EMBED_FILES += www/index_ov5640.html.gz -COMPONENT_EMBED_FILES += www/monitor.html.gz diff --git a/examples/camera_web_server/main/include/app_camera.h b/examples/camera_web_server/main/include/app_camera.h deleted file mode 100755 index 333fd3e..0000000 --- a/examples/camera_web_server/main/include/app_camera.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - * ESPRESSIF MIT License - * - * Copyright (c) 2017 - * - * Permission is hereby granted for use on ESPRESSIF SYSTEMS products only, in which case, - * it is free of charge, to any person obtaining a copy of this software and associated - * documentation files (the "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all copies or - * substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ -#ifndef _APP_CAMERA_H_ -#define _APP_CAMERA_H_ - -#if CONFIG_CAMERA_MODEL_WROVER_KIT -#define CAM_BOARD "WROVER-KIT" -#define PWDN_GPIO_NUM -1 -#define RESET_GPIO_NUM -1 -#define XCLK_GPIO_NUM 21 -#define SIOD_GPIO_NUM 26 -#define SIOC_GPIO_NUM 27 - -#define Y9_GPIO_NUM 35 -#define Y8_GPIO_NUM 34 -#define Y7_GPIO_NUM 39 -#define Y6_GPIO_NUM 36 -#define Y5_GPIO_NUM 19 -#define Y4_GPIO_NUM 18 -#define Y3_GPIO_NUM 5 -#define Y2_GPIO_NUM 4 -#define VSYNC_GPIO_NUM 25 -#define HREF_GPIO_NUM 23 -#define PCLK_GPIO_NUM 22 - -#elif CONFIG_CAMERA_MODEL_ESP32_CAM_BOARD -#define CAM_BOARD "ESP-DEVCAM" -#define PWDN_GPIO_NUM 32 -#define RESET_GPIO_NUM 33 -#define XCLK_GPIO_NUM 4 -#define SIOD_GPIO_NUM 18 -#define SIOC_GPIO_NUM 23 - -#define Y9_GPIO_NUM 36 -#define Y8_GPIO_NUM 19 -#define Y7_GPIO_NUM 21 -#define Y6_GPIO_NUM 39 -#define Y5_GPIO_NUM 35 -#define Y4_GPIO_NUM 14 -#define Y3_GPIO_NUM 13 -#define Y2_GPIO_NUM 34 -#define VSYNC_GPIO_NUM 5 -#define HREF_GPIO_NUM 27 -#define PCLK_GPIO_NUM 25 - -#elif CONFIG_CAMERA_MODEL_ESP_EYE -#define CAM_BOARD "ESP-EYE" -#define PWDN_GPIO_NUM -1 -#define RESET_GPIO_NUM -1 -#define XCLK_GPIO_NUM 4 -#define SIOD_GPIO_NUM 18 -#define SIOC_GPIO_NUM 23 - -#define Y9_GPIO_NUM 36 -#define Y8_GPIO_NUM 37 -#define Y7_GPIO_NUM 38 -#define Y6_GPIO_NUM 39 -#define Y5_GPIO_NUM 35 -#define Y4_GPIO_NUM 14 -#define Y3_GPIO_NUM 13 -#define Y2_GPIO_NUM 34 -#define VSYNC_GPIO_NUM 5 -#define HREF_GPIO_NUM 27 -#define PCLK_GPIO_NUM 25 - -#elif CONFIG_CAMERA_MODEL_M5STACK_PSRAM -#define CAM_BOARD "M5CAM" -#define PWDN_GPIO_NUM -1 -#define RESET_GPIO_NUM 15 -#define XCLK_GPIO_NUM 27 -#define SIOD_GPIO_NUM 25 -#define SIOC_GPIO_NUM 23 - -#define Y9_GPIO_NUM 19 -#define Y8_GPIO_NUM 36 -#define Y7_GPIO_NUM 18 -#define Y6_GPIO_NUM 39 -#define Y5_GPIO_NUM 5 -#define Y4_GPIO_NUM 34 -#define Y3_GPIO_NUM 35 -#define Y2_GPIO_NUM 32 -#define VSYNC_GPIO_NUM 22 -#define HREF_GPIO_NUM 26 -#define PCLK_GPIO_NUM 21 - -#elif CONFIG_CAMERA_MODEL_M5STACK_WIDE -#define CAM_BOARD "M5CAMW" -#define PWDN_GPIO_NUM -1 -#define RESET_GPIO_NUM 15 -#define XCLK_GPIO_NUM 27 -#define SIOD_GPIO_NUM 22 -#define SIOC_GPIO_NUM 23 - -#define Y9_GPIO_NUM 19 -#define Y8_GPIO_NUM 36 -#define Y7_GPIO_NUM 18 -#define Y6_GPIO_NUM 39 -#define Y5_GPIO_NUM 5 -#define Y4_GPIO_NUM 34 -#define Y3_GPIO_NUM 35 -#define Y2_GPIO_NUM 32 -#define VSYNC_GPIO_NUM 25 -#define HREF_GPIO_NUM 26 -#define PCLK_GPIO_NUM 21 - -#elif CONFIG_CAMERA_MODEL_AI_THINKER -#define CAM_BOARD "AI-THINKER" -#define PWDN_GPIO_NUM 32 -#define RESET_GPIO_NUM -1 -#define XCLK_GPIO_NUM 0 -#define SIOD_GPIO_NUM 26 -#define SIOC_GPIO_NUM 27 - -#define Y9_GPIO_NUM 35 -#define Y8_GPIO_NUM 34 -#define Y7_GPIO_NUM 39 -#define Y6_GPIO_NUM 36 -#define Y5_GPIO_NUM 21 -#define Y4_GPIO_NUM 19 -#define Y3_GPIO_NUM 18 -#define Y2_GPIO_NUM 5 -#define VSYNC_GPIO_NUM 25 -#define HREF_GPIO_NUM 23 -#define PCLK_GPIO_NUM 22 - - -#elif CONFIG_CAMERA_MODEL_CUSTOM -#define CAM_BOARD "CUSTOM" -#define PWDN_GPIO_NUM CONFIG_CAMERA_PIN_PWDN -#define RESET_GPIO_NUM CONFIG_CAMERA_PIN_RESET -#define XCLK_GPIO_NUM CONFIG_CAMERA_PIN_XCLK -#define SIOD_GPIO_NUM CONFIG_CAMERA_PIN_SIOD -#define SIOC_GPIO_NUM CONFIG_CAMERA_PIN_SIOC - -#define Y9_GPIO_NUM CONFIG_CAMERA_PIN_Y9 -#define Y8_GPIO_NUM CONFIG_CAMERA_PIN_Y8 -#define Y7_GPIO_NUM CONFIG_CAMERA_PIN_Y7 -#define Y6_GPIO_NUM CONFIG_CAMERA_PIN_Y6 -#define Y5_GPIO_NUM CONFIG_CAMERA_PIN_Y5 -#define Y4_GPIO_NUM CONFIG_CAMERA_PIN_Y4 -#define Y3_GPIO_NUM CONFIG_CAMERA_PIN_Y3 -#define Y2_GPIO_NUM CONFIG_CAMERA_PIN_Y2 -#define VSYNC_GPIO_NUM CONFIG_CAMERA_PIN_VSYNC -#define HREF_GPIO_NUM CONFIG_CAMERA_PIN_HREF -#define PCLK_GPIO_NUM CONFIG_CAMERA_PIN_PCLK -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -void app_camera_main(); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/examples/camera_web_server/main/include/app_httpd.h b/examples/camera_web_server/main/include/app_httpd.h deleted file mode 100644 index 6f31655..0000000 --- a/examples/camera_web_server/main/include/app_httpd.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _CAMERA_HTTPD_H_ -#define _CAMERA_HTTPD_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -void app_httpd_main(); - -#ifdef __cplusplus -} -#endif - -#endif /* _CAMERA_HTTPD_H_ */ diff --git a/examples/camera_web_server/main/include/app_httpd.hpp b/examples/camera_web_server/main/include/app_httpd.hpp new file mode 100644 index 0000000..03b8e6a --- /dev/null +++ b/examples/camera_web_server/main/include/app_httpd.hpp @@ -0,0 +1,6 @@ +#pragma once + + +#include "esp_http_server.h" + +void app_httpd_main(); diff --git a/examples/camera_web_server/main/include/app_mdns.h b/examples/camera_web_server/main/include/app_mdns.h index 90769d1..002a448 100644 --- a/examples/camera_web_server/main/include/app_mdns.h +++ b/examples/camera_web_server/main/include/app_mdns.h @@ -1,31 +1,16 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef _CAMERA_MDNS_H_ -#define _CAMERA_MDNS_H_ +#pragma once #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif #include -void app_mdns_main(); -void app_mdns_update_framesize(int size); -const char * app_mdns_query(size_t * out_len); + void app_mdns_main(); + void app_mdns_update_framesize(int size); + const char *app_mdns_query(size_t *out_len); #ifdef __cplusplus } #endif - -#endif /* _CAMERA_MDNS_H_ */ diff --git a/examples/camera_web_server/sdkconfig.defaults b/examples/camera_web_server/sdkconfig.defaults new file mode 100644 index 0000000..eab8556 --- /dev/null +++ b/examples/camera_web_server/sdkconfig.defaults @@ -0,0 +1,22 @@ +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y + +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y + +CONFIG_SPIRAM_SPEED_80M=y + +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" + +CONFIG_ESP_TASK_WDT=n + +CONFIG_DL_DETECT_ENABLED=y +CONFIG_DL_DETECT_HUMAN_FACE=y +CONFIG_DL_DETECT_HUMAN_FACE_WITH_KEYPOINT=y +CONFIG_DL_RECOGNIZE_HUMAN_FACE=y + + +# Wait for esp-idf stable +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF=y +CONFIG_BOOTLOADER_LOG_LEVEL_NONE=y +CONFIG_SPIRAM_MEMTEST=n diff --git a/examples/camera_web_server/sdkconfig.defaults.esp32 b/examples/camera_web_server/sdkconfig.defaults.esp32 new file mode 100644 index 0000000..4b6198b --- /dev/null +++ b/examples/camera_web_server/sdkconfig.defaults.esp32 @@ -0,0 +1,5 @@ +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32_SPIRAM_SUPPORT=y + +CONFIG_CAMERA_MODULE_ESP_EYE=y +CONFIG_CAMERA_PIXEL_FORMAT_JPEG=y \ No newline at end of file diff --git a/examples/camera_web_server/sdkconfig.defaults.esp32s2 b/examples/camera_web_server/sdkconfig.defaults.esp32s2 new file mode 100644 index 0000000..54c3aaa --- /dev/null +++ b/examples/camera_web_server/sdkconfig.defaults.esp32s2 @@ -0,0 +1,2 @@ +CONFIG_ESP32S2_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32S2_SPIRAM_SUPPORT=y diff --git a/examples/camera_web_server/sdkconfig.defaults.esp32s3 b/examples/camera_web_server/sdkconfig.defaults.esp32s3 new file mode 100644 index 0000000..9f98804 --- /dev/null +++ b/examples/camera_web_server/sdkconfig.defaults.esp32s3 @@ -0,0 +1,7 @@ +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32S3_SPIRAM_SUPPORT=y + +CONFIG_CAMERA_MODULE_ESP_S3_EYE=y +CONFIG_CAMERA_PIXEL_FORMAT_RGB565=y +CONFIG_ESPTOOLPY_NO_STUB=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y