✨ 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_REQUIRES
|
||||
esp32-camera
|
||||
esp-dl
|
||||
common
|
||||
nvs_flash
|
||||
esp_http_server
|
||||
fb_gfx
|
||||
|
|
|
@ -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_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_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
|
||||
|
|
|
@ -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
|
||||
// limitations under the License.
|
||||
|
||||
#include "app_httpd.h"
|
||||
#include "app_httpd.hpp"
|
||||
|
||||
#include <list>
|
||||
#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 <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
|
||||
#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<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> &detect_results = detector2.infer((IMAGE_T *)image_ptr, {(int)fb->height, (int)fb->width, 3}, detect_candidates);
|
||||
#else
|
||||
std::list<dl::detect::result_t> &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<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)
|
||||
{
|
||||
_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<dl::detect::result_t> &candidates = detector.infer((uint8_t *)image_rgb888, {(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);
|
||||
#else
|
||||
std::list<dl::detect::result_t> &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<dl::detect::result_t>::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");
|
||||
|
|
|
@ -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_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},
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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,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 <stddef.h>
|
||||
|
||||
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_ */
|
||||
|
|
|
@ -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