✨ Camera with Web Server
parent
5f5eea3ba4
commit
e1208b886b
|
@ -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
|
|
||||||
|
|
|
@ -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).
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
################################################################################################################################
|
||||||
|
Camera with Web Server `[中文] <./README_cn.rst>`_
|
||||||
|
################################################################################################################################
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
################################################################################################################################
|
||||||
|
Camera with Web Server `[English] <./README.rst>`_
|
||||||
|
################################################################################################################################
|
||||||
|
|
||||||
|
该示例的输入图片来自摄像头,输出结果网页端。该示例演示了以下模型接口在实际项目中的使用情况。
|
||||||
|
|
||||||
|
+ `HumanFaceDetectMSR01 <https://github.com/espressif/esp-dl/blob/master/include/model_zoo/human_face_detect_msr01.hpp>`_
|
||||||
|
|
||||||
|
+ `HumanFaceDetectMNP01 <https://github.com/espressif/esp-dl/blob/master/include/model_zoo/human_face_detect_mnp01.hpp>`_
|
||||||
|
|
||||||
|
+ `CatFaceDetectMN03 <https://github.com/espressif/esp-dl/blob/master/include/model_zoo/cat_face_detect_mn03.hpp>`_
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
运行示例
|
||||||
|
************************************************************************************************
|
||||||
|
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
|
||||||
|
|
||||||
|
..
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 45 KiB |
Binary file not shown.
After Width: | Height: | Size: 231 KiB |
|
@ -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_ADD_INCLUDEDIRS "include")
|
||||||
|
|
||||||
set(COMPONENT_REQUIRES
|
set(COMPONENT_REQUIRES
|
||||||
esp32-camera
|
esp32-camera
|
||||||
esp-dl
|
esp-dl
|
||||||
|
common
|
||||||
nvs_flash
|
nvs_flash
|
||||||
esp_http_server
|
esp_http_server
|
||||||
fb_gfx
|
fb_gfx
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
menu "Camera Web Server"
|
menu "Example Configuration"
|
||||||
|
|
||||||
menu "WiFi Settings"
|
|
||||||
config ESP_HOST_NAME
|
config ESP_HOST_NAME
|
||||||
string "Camera Host Name"
|
string "Camera Host Name"
|
||||||
default ""
|
default ""
|
||||||
|
@ -54,242 +53,5 @@ config ESP_MAXIMUM_RETRY
|
||||||
default 5
|
default 5
|
||||||
help
|
help
|
||||||
Set the Maximum retry to avoid station reconnecting to the AP unlimited when the AP is really inexistent.
|
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
|
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
|
@ -1,120 +0,0 @@
|
||||||
/* ESPRESSIF MIT License
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
|
|
||||||
*
|
|
||||||
* 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);
|
|
||||||
}
|
|
|
@ -12,16 +12,17 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#include "app_httpd.h"
|
#include "app_httpd.hpp"
|
||||||
|
|
||||||
|
#include <list>
|
||||||
#include "esp_http_server.h"
|
#include "esp_http_server.h"
|
||||||
#include "esp_timer.h"
|
#include "esp_timer.h"
|
||||||
#include "esp_camera.h"
|
|
||||||
#include "img_converters.h"
|
#include "img_converters.h"
|
||||||
#include "fb_gfx.h"
|
#include "fb_gfx.h"
|
||||||
#include "driver/ledc.h"
|
|
||||||
#include "sdkconfig.h"
|
|
||||||
#include "app_mdns.h"
|
#include "app_mdns.h"
|
||||||
#include "app_camera.h"
|
#include "app_camera.hpp"
|
||||||
|
#include "app_common.hpp"
|
||||||
|
#include "sdkconfig.h"
|
||||||
#include "dl_tool.hpp"
|
#include "dl_tool.hpp"
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG)
|
#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG)
|
||||||
|
@ -32,44 +33,29 @@
|
||||||
static const char *TAG = "camera_httpd";
|
static const char *TAG = "camera_httpd";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_DL_DETECT_ENABLED
|
#if CONFIG_DL_HUMAN_FACE_DETECTION_S1_MSR01
|
||||||
#include <list>
|
|
||||||
#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
|
|
||||||
#include "human_face_detect_msr01.hpp"
|
#include "human_face_detect_msr01.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_DL_DETECT_HUMAN_FACE_WITH_KEYPOINT
|
#if CONFIG_DL_HUMAN_FACE_DETECTION_S2_MNP01
|
||||||
#include "human_face_detect_mnp01.hpp"
|
#include "human_face_detect_mnp01.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_DL_DETECT_CAT_FACE
|
#if CONFIG_DL_CAT_FACE_DETECTION_MN03
|
||||||
#include "cat_face_detect_mn03.hpp"
|
#include "cat_face_detect_mn03.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_DL_RECOGNIZE_HUMAN_FACE
|
#if CONFIG_DL_HUMAN_FACE_RECOGNITION_XXX
|
||||||
// TODO: recognize human face
|
// TODO: recognize human face
|
||||||
static int8_t recognition_enabled = 0;
|
|
||||||
static int8_t is_enrolling = 0;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int8_t detection_enabled = 0;
|
||||||
|
static int8_t recognition_enabled = 0;
|
||||||
|
static int8_t is_enrolling = 0;
|
||||||
|
|
||||||
#ifdef CONFIG_LED_ILLUMINATOR_ENABLED
|
#ifdef CONFIG_LED_ILLUMINATOR_ENABLED
|
||||||
|
#include "app_led.h"
|
||||||
int led_duty = 0;
|
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
|
#endif
|
||||||
|
|
||||||
typedef struct
|
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 stream_httpd = NULL;
|
||||||
httpd_handle_t camera_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)
|
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;
|
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;
|
esp_err_t res = ESP_OK;
|
||||||
|
|
||||||
#ifdef CONFIG_LED_ILLUMINATOR_ENABLED
|
#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()
|
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.
|
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
|
#else
|
||||||
fb = esp_camera_fb_get();
|
fb = esp_camera_fb_get();
|
||||||
#endif
|
#endif
|
||||||
|
@ -177,28 +149,32 @@ static esp_err_t stream_handler(httpd_req_t *req)
|
||||||
char *part_buf[128];
|
char *part_buf[128];
|
||||||
dl::tool::Latency latency_total(24);
|
dl::tool::Latency latency_total(24);
|
||||||
|
|
||||||
#if CONFIG_DL_DETECT_ENABLED
|
IMAGE_T *image_ptr = NULL;
|
||||||
uint8_t *image_rgb888 = NULL;
|
bool is_detected = false;
|
||||||
|
|
||||||
|
dl::tool::Latency latency_fetch;
|
||||||
dl::tool::Latency latency_decode;
|
dl::tool::Latency latency_decode;
|
||||||
dl::tool::Latency latency_encode;
|
dl::tool::Latency latency_encode;
|
||||||
dl::tool::Latency latency_detect;
|
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);
|
HumanFaceDetectMSR01 detector(0.3F, 0.3F, 10, 0.3F);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_DL_DETECT_HUMAN_FACE_WITH_KEYPOINT
|
#if CONFIG_DL_HUMAN_FACE_DETECTION_S2_MNP01
|
||||||
HumanFaceDetectMNP01 detector2(0.4F, 0.3F, 10);
|
HumanFaceDetectMNP01 detector2(0.4F, 0.3F, 10);
|
||||||
#endif
|
#endif
|
||||||
|
#if CONFIG_DL_HUMAN_FACE_RECOGNITION_XXX
|
||||||
#if CONFIG_DL_DETECT_CAT_FACE
|
// TODO: recognize human face
|
||||||
CatFaceDetectMN03 detector(0.4F, 0.3F, 10, 0.3F);
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_DL_RECOGNIZE_HUMAN_FACE
|
#if CONFIG_DL_CAT_FACE
|
||||||
dl::tool::Latency latency_recognize;
|
#if CONFIG_DL_CAT_FACE_DETECTION_MN03
|
||||||
// TODO: recognize human face
|
CatFaceDetectMN03 detector(0.4F, 0.3F, 10, 0.3F);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
|
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");
|
httpd_resp_set_hdr(req, "X-Framerate", "60");
|
||||||
|
|
||||||
#ifdef CONFIG_LED_ILLUMINATOR_ENABLED
|
#ifdef CONFIG_LED_ILLUMINATOR_ENABLED
|
||||||
enable_led(true);
|
app_led_duty(led_duty);
|
||||||
isStreaming = true;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
|
{
|
||||||
|
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_total.start();
|
||||||
|
|
||||||
|
latency_fetch.start();
|
||||||
fb = esp_camera_fb_get();
|
fb = esp_camera_fb_get();
|
||||||
if (!fb)
|
if (!fb)
|
||||||
{
|
{
|
||||||
ESP_LOGE(TAG, "Camera capture failed");
|
ESP_LOGE(TAG, "Camera capture failed");
|
||||||
res = ESP_FAIL;
|
res = ESP_FAIL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
_timestamp.tv_sec = fb->timestamp.tv_sec;
|
_timestamp.tv_sec = fb->timestamp.tv_sec;
|
||||||
_timestamp.tv_usec = fb->timestamp.tv_usec;
|
_timestamp.tv_usec = fb->timestamp.tv_usec;
|
||||||
#if CONFIG_DL_DETECT_ENABLED
|
latency_fetch.end();
|
||||||
if (!detection_enabled || fb->width > 400)
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
ESP_LOGE(TAG, "JPEG compression failed");
|
|
||||||
res = ESP_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_jpg_buf_len = fb->len;
|
|
||||||
_jpg_buf = fb->buf;
|
|
||||||
}
|
|
||||||
#if CONFIG_DL_DETECT_ENABLED
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
image_rgb888 = (uint8_t *)dl::tool::malloc_aligned(fb->height * fb->width * 3, sizeof(uint8_t));
|
|
||||||
|
|
||||||
if (!image_rgb888)
|
#if CONFIG_DL_ENABLED
|
||||||
{
|
if (detection_enabled && fb->width < 400)
|
||||||
ESP_LOGE(TAG, "dl_matrix3du_alloc failed");
|
|
||||||
res = ESP_FAIL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
latency_decode.start();
|
latency_decode.start();
|
||||||
if (!fmt2rgb888(fb->buf, fb->len, fb->format, image_rgb888))
|
if (app_camera_decode(fb, &image_ptr) == false)
|
||||||
{
|
{
|
||||||
ESP_LOGE(TAG, "fmt2rgb888 failed");
|
|
||||||
res = ESP_FAIL;
|
res = ESP_FAIL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
latency_decode.end();
|
latency_decode.end();
|
||||||
|
|
||||||
|
#if CONFIG_DL_HUMAN_FACE
|
||||||
latency_detect.start();
|
latency_detect.start();
|
||||||
#if CONFIG_DL_DETECT_HUMAN_FACE_WITH_KEYPOINT
|
#if CONFIG_DL_HUMAN_FACE_DETECTION_S2_ENABLED
|
||||||
std::list<dl::detect::result_t> &candidates = detector.infer((uint8_t *)image_rgb888, {(int)fb->height, (int)fb->width, 3});
|
std::list<dl::detect::result_t> &detect_candidates = detector.infer((IMAGE_T *)image_ptr, {(int)fb->height, (int)fb->width, 3});
|
||||||
std::list<dl::detect::result_t> &results = detector2.infer((uint8_t *)image_rgb888, {(int)fb->height, (int)fb->width, 3}, candidates);
|
std::list<dl::detect::result_t> &detect_results = detector2.infer((IMAGE_T *)image_ptr, {(int)fb->height, (int)fb->width, 3}, detect_candidates);
|
||||||
#else
|
#else
|
||||||
std::list<dl::detect::result_t> &results = detector.infer((uint8_t *)image_rgb888, {(int)fb->height, (int)fb->width, 3});
|
std::list<dl::detect::result_t> &detect_results = detector.infer((IMAGE_T *)image_ptr, {(int)fb->height, (int)fb->width, 3});
|
||||||
#endif
|
#endif
|
||||||
latency_detect.end();
|
latency_detect.end();
|
||||||
|
|
||||||
if (results.size() > 0 || fb->format != PIXFORMAT_JPEG)
|
if (detect_results.size() > 0)
|
||||||
{
|
{
|
||||||
int i = 0;
|
is_detected = true;
|
||||||
for (std::list<dl::detect::result_t>::iterator prediction = results.begin(); prediction != results.end(); prediction++, i++)
|
draw_detection_result((IMAGE_T*)image_ptr, fb->height, fb->width, detect_results);
|
||||||
|
|
||||||
|
latency_recognize.start();
|
||||||
|
if (recognition_enabled)
|
||||||
{
|
{
|
||||||
dl::image::draw_hollow_rectangle(image_rgb888, fb->height, fb->width,
|
#if CONFIG_DL_HUMAN_FACE_RECOGNITION_XXX
|
||||||
DL_MAX(prediction->box[0], 0),
|
// TODO: recognize human face
|
||||||
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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_DL_RECOGNIZE_HUMAN_FACE
|
|
||||||
latency_recognize.start();
|
|
||||||
// TODO: recognize human face
|
|
||||||
latency_recognize.end();
|
latency_recognize.end();
|
||||||
#endif
|
}
|
||||||
|
#endif // CONFIG_DL_HUMAN_FACE
|
||||||
|
|
||||||
|
#if CONFIG_DL_CAT_FACE
|
||||||
|
latency_detect.start();
|
||||||
|
std::list<dl::detect::result_t> &detect_results = detector.infer((IMAGE_T *)image_ptr, {(int)fb->height, (int)fb->width, 3});
|
||||||
|
latency_detect.end();
|
||||||
|
if (detect_results.size() > 0)
|
||||||
|
{
|
||||||
|
is_detected = true;
|
||||||
|
draw_detection_result((IMAGE_T*)image_ptr, fb->height, fb->width, detect_results);
|
||||||
|
}
|
||||||
|
#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();
|
latency_encode.start();
|
||||||
if (!fmt2jpg(image_rgb888, fb->width * fb->height * 3, fb->width, fb->height, PIXFORMAT_RGB888, 90, &_jpg_buf, &_jpg_buf_len))
|
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");
|
ESP_LOGE(TAG, "fmt2jpg failed");
|
||||||
|
res = ESP_FAIL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_camera_fb_return(fb);
|
esp_camera_fb_return(fb);
|
||||||
fb = NULL;
|
fb = NULL;
|
||||||
latency_encode.end();
|
|
||||||
}
|
}
|
||||||
else
|
else if (fb->format == PIXFORMAT_JPEG)
|
||||||
{
|
{
|
||||||
_jpg_buf = fb->buf;
|
_jpg_buf = fb->buf;
|
||||||
_jpg_buf_len = fb->len;
|
_jpg_buf_len = fb->len;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len))
|
||||||
|
{
|
||||||
|
ESP_LOGE(TAG, "JPEG compression failed");
|
||||||
|
res = ESP_FAIL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
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
|
#endif
|
||||||
}
|
} while (0);
|
||||||
|
|
||||||
if (res == ESP_OK)
|
if (res == ESP_OK)
|
||||||
{
|
{
|
||||||
res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
|
res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res == ESP_OK)
|
if (res == ESP_OK)
|
||||||
{
|
{
|
||||||
size_t hlen = snprintf((char *)part_buf, 128, _STREAM_PART, _jpg_buf_len, _timestamp.tv_sec, _timestamp.tv_usec);
|
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);
|
res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res == ESP_OK)
|
if (res == ESP_OK)
|
||||||
{
|
{
|
||||||
res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
|
res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fb)
|
if (fb)
|
||||||
{
|
{
|
||||||
esp_camera_fb_return(fb);
|
esp_camera_fb_return(fb);
|
||||||
|
@ -349,47 +342,27 @@ static esp_err_t stream_handler(httpd_req_t *req)
|
||||||
free(_jpg_buf);
|
free(_jpg_buf);
|
||||||
_jpg_buf = NULL;
|
_jpg_buf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res != ESP_OK)
|
if (res != ESP_OK)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
latency_total.end();
|
|
||||||
|
|
||||||
|
latency_total.end();
|
||||||
uint32_t frame_latency = latency_total.get_period() / 1000;
|
uint32_t frame_latency = latency_total.get_period() / 1000;
|
||||||
uint32_t average_frame_latency = latency_total.get_average_period() / 1000;
|
uint32_t average_frame_latency = latency_total.get_average_period() / 1000;
|
||||||
|
|
||||||
#if CONFIG_DL_RECOGNIZE_HUMAN_FACE
|
ESP_LOGI(TAG, "Frame: %4ums (%2.1ffps), Average: %4ums (%2.1ffps) | fetch %4ums, decode: %4ums, detect: %4ums, recognize: %5ums, encode: %4ums",
|
||||||
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,
|
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_decode.get_period() / 1000,
|
||||||
latency_detect.get_period() / 1000,
|
latency_detect.get_period() / 1000,
|
||||||
latency_recognize.get_period() / 1000,
|
latency_recognize.get_period() / 1000,
|
||||||
latency_encode.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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_LED_ILLUMINATOR_ENABLED
|
#ifdef CONFIG_LED_ILLUMINATOR_ENABLED
|
||||||
isStreaming = false;
|
app_led_duty(0);
|
||||||
enable_led(false);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
@ -500,25 +473,17 @@ static esp_err_t cmd_handler(httpd_req_t *req)
|
||||||
res = s->set_ae_level(s, val);
|
res = s->set_ae_level(s, val);
|
||||||
#ifdef CONFIG_LED_ILLUMINATOR_ENABLED
|
#ifdef CONFIG_LED_ILLUMINATOR_ENABLED
|
||||||
else if (!strcmp(variable, "led_intensity"))
|
else if (!strcmp(variable, "led_intensity"))
|
||||||
{
|
|
||||||
led_duty = val;
|
led_duty = val;
|
||||||
if (isStreaming)
|
|
||||||
enable_led(true);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_DL_DETECT_ENABLED
|
|
||||||
else if (!strcmp(variable, "face_detect"))
|
else if (!strcmp(variable, "face_detect"))
|
||||||
{
|
{
|
||||||
detection_enabled = val;
|
detection_enabled = val;
|
||||||
#if CONFIG_DL_RECOGNIZE_HUMAN_FACE
|
|
||||||
if (!detection_enabled)
|
if (!detection_enabled)
|
||||||
{
|
{
|
||||||
recognition_enabled = 0;
|
recognition_enabled = 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#if CONFIG_DL_RECOGNIZE_HUMAN_FACE
|
|
||||||
else if (!strcmp(variable, "face_enroll"))
|
else if (!strcmp(variable, "face_enroll"))
|
||||||
is_enrolling = val;
|
is_enrolling = val;
|
||||||
else if (!strcmp(variable, "face_recognize"))
|
else if (!strcmp(variable, "face_recognize"))
|
||||||
|
@ -529,8 +494,6 @@ static esp_err_t cmd_handler(httpd_req_t *req)
|
||||||
detection_enabled = val;
|
detection_enabled = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
res = -1;
|
res = -1;
|
||||||
|
@ -594,7 +557,7 @@ static esp_err_t status_handler(httpd_req_t *req)
|
||||||
p += print_reg(p, s, 0x132, 0xFF);
|
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, "\"xclk\":%u,", s->xclk_freq_hz / 1000000);
|
||||||
p += sprintf(p, "\"pixformat\":%u,", s->pixformat);
|
p += sprintf(p, "\"pixformat\":%u,", s->pixformat);
|
||||||
p += sprintf(p, "\"framesize\":%u,", s->status.framesize);
|
p += sprintf(p, "\"framesize\":%u,", s->status.framesize);
|
||||||
|
@ -626,13 +589,9 @@ static esp_err_t status_handler(httpd_req_t *req)
|
||||||
#else
|
#else
|
||||||
p += sprintf(p, ",\"led_intensity\":%d", -1);
|
p += sprintf(p, ",\"led_intensity\":%d", -1);
|
||||||
#endif
|
#endif
|
||||||
#if CONFIG_DL_DETECT_ENABLED
|
|
||||||
p += sprintf(p, ",\"face_detect\":%u", detection_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_enroll\":%u,", is_enrolling);
|
||||||
p += sprintf(p, "\"face_recognize\":%u", recognition_enabled);
|
p += sprintf(p, "\"face_recognize\":%u", recognition_enabled);
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
*p++ = '}';
|
*p++ = '}';
|
||||||
*p++ = 0;
|
*p++ = 0;
|
||||||
httpd_resp_set_type(req, "application/json");
|
httpd_resp_set_type(req, "application/json");
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
/* ESPRESSIF MIT License
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
|
|
||||||
*
|
|
||||||
* 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();
|
|
||||||
}
|
|
|
@ -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();
|
||||||
|
}
|
|
@ -30,7 +30,7 @@
|
||||||
#include "esp_wifi.h"
|
#include "esp_wifi.h"
|
||||||
#include "esp_camera.h"
|
#include "esp_camera.h"
|
||||||
#include "mdns.h"
|
#include "mdns.h"
|
||||||
#include "app_camera.h"
|
#include "app_define.h"
|
||||||
|
|
||||||
static const char *TAG = "camera mdns";
|
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, "\"pixformat\":\"%s\",", pixformat);
|
||||||
p += sprintf(p, "\"framesize\":\"%s\",", framesize);
|
p += sprintf(p, "\"framesize\":\"%s\",", framesize);
|
||||||
p += sprintf(p, "\"stream_port\":\"81\",");
|
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 += sprintf(p, "\"model\":\"%s\"", model);
|
||||||
*p++ = '}';
|
*p++ = '}';
|
||||||
*p++ = ',';
|
*p++ = ',';
|
||||||
|
@ -196,7 +196,7 @@ void app_mdns_main()
|
||||||
ESP_LOGE(TAG, "esp_read_mac() Failed");
|
ESP_LOGE(TAG, "esp_read_mac() Failed");
|
||||||
return;
|
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);
|
snprintf(framesize, 4, "%d", s->status.framesize);
|
||||||
|
@ -234,7 +234,7 @@ void app_mdns_main()
|
||||||
|
|
||||||
|
|
||||||
mdns_txt_item_t camera_txt_data[] = {
|
mdns_txt_item_t camera_txt_data[] = {
|
||||||
{(char*)"board" ,(char*)CAM_BOARD},
|
{(char*)"board" ,(char*)CAMERA_MODULE_NAME},
|
||||||
{(char*)"model" ,(char*)model},
|
{(char*)"model" ,(char*)model},
|
||||||
{(char*)"stream_port" ,(char*)"81"},
|
{(char*)"stream_port" ,(char*)"81"},
|
||||||
{(char*)"framesize" ,(char*)framesize},
|
{(char*)"framesize" ,(char*)framesize},
|
||||||
|
|
|
@ -55,7 +55,8 @@ static int s_retry_num = 0;
|
||||||
|
|
||||||
static esp_err_t event_handler(void *ctx, system_event_t *event)
|
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:
|
case SYSTEM_EVENT_AP_STACONNECTED:
|
||||||
ESP_LOGI(TAG, "station:" MACSTR " join, AID=%d",
|
ESP_LOGI(TAG, "station:" MACSTR " join, AID=%d",
|
||||||
MAC2STR(event->event_info.sta_connected.mac),
|
MAC2STR(event->event_info.sta_connected.mac),
|
||||||
|
@ -76,7 +77,8 @@ static esp_err_t event_handler(void *ctx, system_event_t *event)
|
||||||
break;
|
break;
|
||||||
case SYSTEM_EVENT_STA_DISCONNECTED:
|
case SYSTEM_EVENT_STA_DISCONNECTED:
|
||||||
{
|
{
|
||||||
if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) {
|
if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY)
|
||||||
|
{
|
||||||
esp_wifi_connect();
|
esp_wifi_connect();
|
||||||
s_retry_num++;
|
s_retry_num++;
|
||||||
ESP_LOGI(TAG, "retry to connect to the AP");
|
ESP_LOGI(TAG, "retry to connect to the AP");
|
||||||
|
@ -112,10 +114,12 @@ void wifi_init_softap()
|
||||||
snprintf((char *)wifi_config.ap.password, 64, "%s", EXAMPLE_ESP_WIFI_AP_PASS);
|
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.max_connection = EXAMPLE_MAX_STA_CONN;
|
||||||
wifi_config.ap.authmode = WIFI_AUTH_WPA_WPA2_PSK;
|
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;
|
wifi_config.ap.authmode = WIFI_AUTH_OPEN;
|
||||||
}
|
}
|
||||||
if (strlen(EXAMPLE_ESP_WIFI_AP_CHANNEL)) {
|
if (strlen(EXAMPLE_ESP_WIFI_AP_CHANNEL))
|
||||||
|
{
|
||||||
int channel;
|
int channel;
|
||||||
sscanf(EXAMPLE_ESP_WIFI_AP_CHANNEL, "%d", &channel);
|
sscanf(EXAMPLE_ESP_WIFI_AP_CHANNEL, "%d", &channel);
|
||||||
wifi_config.ap.channel = channel;
|
wifi_config.ap.channel = channel;
|
||||||
|
@ -146,22 +150,29 @@ void app_wifi_main()
|
||||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||||
wifi_mode_t mode = WIFI_MODE_NULL;
|
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;
|
mode = WIFI_MODE_APSTA;
|
||||||
} else if (strlen(EXAMPLE_ESP_WIFI_AP_SSID)) {
|
}
|
||||||
|
else if (strlen(EXAMPLE_ESP_WIFI_AP_SSID))
|
||||||
|
{
|
||||||
mode = WIFI_MODE_AP;
|
mode = WIFI_MODE_AP;
|
||||||
} else if (strlen(EXAMPLE_ESP_WIFI_SSID)) {
|
}
|
||||||
|
else if (strlen(EXAMPLE_ESP_WIFI_SSID))
|
||||||
|
{
|
||||||
mode = WIFI_MODE_STA;
|
mode = WIFI_MODE_STA;
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t ret = nvs_flash_init();
|
esp_err_t ret = nvs_flash_init();
|
||||||
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
|
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
|
||||||
|
{
|
||||||
ESP_ERROR_CHECK(nvs_flash_erase());
|
ESP_ERROR_CHECK(nvs_flash_erase());
|
||||||
ret = nvs_flash_init();
|
ret = nvs_flash_init();
|
||||||
}
|
}
|
||||||
ESP_ERROR_CHECK(ret);
|
ESP_ERROR_CHECK(ret);
|
||||||
|
|
||||||
if (mode == WIFI_MODE_NULL) {
|
if (mode == WIFI_MODE_NULL)
|
||||||
|
{
|
||||||
ESP_LOGW(TAG, "Neither AP or STA have been configured. WiFi will be off.");
|
ESP_LOGW(TAG, "Neither AP or STA have been configured. WiFi will be off.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -171,11 +182,13 @@ void app_wifi_main()
|
||||||
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
||||||
ESP_ERROR_CHECK(esp_wifi_set_mode(mode));
|
ESP_ERROR_CHECK(esp_wifi_set_mode(mode));
|
||||||
|
|
||||||
if (mode & WIFI_MODE_AP) {
|
if (mode & WIFI_MODE_AP)
|
||||||
|
{
|
||||||
wifi_init_softap();
|
wifi_init_softap();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode & WIFI_MODE_STA) {
|
if (mode & WIFI_MODE_STA)
|
||||||
|
{
|
||||||
wifi_init_sta();
|
wifi_init_sta();
|
||||||
}
|
}
|
||||||
ESP_ERROR_CHECK(esp_wifi_start());
|
ESP_ERROR_CHECK(esp_wifi_start());
|
||||||
|
|
|
@ -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
|
|
|
@ -1,179 +0,0 @@
|
||||||
/*
|
|
||||||
* ESPRESSIF MIT License
|
|
||||||
*
|
|
||||||
* Copyright (c) 2017 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
|
|
||||||
*
|
|
||||||
* 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
|
|
|
@ -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_ */
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
#include "esp_http_server.h"
|
||||||
|
|
||||||
|
void app_httpd_main();
|
|
@ -1,21 +1,8 @@
|
||||||
// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD
|
#pragma once
|
||||||
//
|
|
||||||
// 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_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C"
|
||||||
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
@ -27,5 +14,3 @@ const char * app_mdns_query(size_t * out_len);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _CAMERA_MDNS_H_ */
|
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,2 @@
|
||||||
|
CONFIG_ESP32S2_DEFAULT_CPU_FREQ_240=y
|
||||||
|
CONFIG_ESP32S2_SPIRAM_SUPPORT=y
|
|
@ -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
|
Loading…
Reference in New Issue