Camera with Web Server

pull/190/head
Ye Hang Yang 2021-07-29 20:49:22 +08:00
parent 5f5eea3ba4
commit e1208b886b
23 changed files with 380 additions and 941 deletions

View File

@ -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

View File

@ -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).

View File

@ -0,0 +1,5 @@
################################################################################################################################
Camera with Web Server `[中文] <./README_cn.rst>`_
################################################################################################################################

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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");

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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},

View File

@ -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());

View File

@ -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

View File

@ -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

View File

@ -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_ */

View File

@ -0,0 +1,6 @@
#pragma once
#include "esp_http_server.h"
void app_httpd_main();

View File

@ -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_ */

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,2 @@
CONFIG_ESP32S2_DEFAULT_CPU_FREQ_240=y
CONFIG_ESP32S2_SPIRAM_SUPPORT=y

View File

@ -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