banner

ESP32 com Câmera e Reconhecimento Facial



O ESP32-CAM é o nosso assunto de hoje, isso por conta de inúmeras sugestões no meu canal do Youtube. Mostro para você dois modelos, mas falo especificamente do funcionamento de câmeras no ESP32. Trago também informações sobre um algoritmo de face detection, que é uma API de teste, portanto, necessitaria de modificação para uma aplicação direta no nosso exemplo.






Montagem






Demonstração

Na demonstração que trago no vídeo, você confere o funcionamento de uma câmera, o registro de um usuário e o reconhecimento de um rosto como cadastrado ou não.







Exemplo que vem com o ESP32

Na IDE do Arduino vá em Arquivo->Exemplos->Exemplos para ESP32 Wrover-> ESP32->Camera
->CameraWebServer. O código a seguir é o mesmo deste exemplo com algumas mudanças. O código do exemplo é constituído de três arquivos: ESP32_Camera.ino (configurações), app_httpd.cpp (webserver e manipulação da câmera) e camera_index.h (bytes da página html)




ESP32_Camera.ino

Includes e defines

#include "esp_camera.h"
#include <WiFi.h>

//
// WARNING!!! Make sure that you have either selected ESP32 Wrover Module,
//            or another board which has PSRAM enabled
//

// Select camera model
// #define CAMERA_MODEL_WROVER_KIT
// #define CAMERA_MODEL_M5STACK_PSRAM
#define CAMERA_MODEL_AI_THINKER
// #define CAMERA_MODEL_TTGO

//Use 1 para que o ESP crie uma rede com o ssid e password
//Use 0 para o ESP se conectar a uma rede que tenha o ssid e password indicado
#define ACCESS_POINT 1
const char* ssid = "CAM2";
const char* password = "12345678";


#if defined(CAMERA_MODEL_WROVER_KIT)

#if defined(CAMERA_MODEL_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 defined(CAMERA_MODEL_M5STACK_PSRAM)

#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
#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 defined(CAMERA_MODEL_AI_THINKER)

#elif defined(CAMERA_MODEL_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 defined(CAMERA_MODEL_TTGO)

#elif defined(CAMERA_MODEL_TTGO)
#define PWDN_GPIO_NUM     0
#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       17
#define VSYNC_GPIO_NUM    22
#define HREF_GPIO_NUM     26
#define PCLK_GPIO_NUM     21
#else
#error "Camera model not selected"
#endif


startCameraServer e Setup

void startCameraServer();

void setup() {
  Serial.begin(115200);
  Serial.println();

  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;



psramFound

//init with high specs to pre-allocate larger buffers
  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }

  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  //drop down frame size for higher initial frame rate
  sensor_t * s = esp_camera_sensor_get();
  s->set_framesize(s, FRAMESIZE_QVGA);



ACCESS_POINT

if(ACCESS_POINT) {
    WiFi.softAP(ssid, password);
  }
  else
  {
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected");
  }

startCameraServer

startCameraServer();

  Serial.print("Camera Ready! Use 'http://");
  Serial.print(ACCESS_POINT ? WiFi.softAPIP() : WiFi.localIP());
  Serial.println("' to connect");
}//setup


Loop

void loop() {

}



Modificar configurações





Testando

Abra o navegador e digite o ip que aparece no Monitor Serial (192.168.4.1 neste exemplo)
http://192.168.4.1 stream de vídeo com configuração
http://192.168.4.1/capture captura uma imagem fixa
http://192.168.4.1/status mostra as configurações atuais
http://192.168.4.1:81/stream apenas o vídeo






FAÇA O DOWNLOAD DOS ARQUIVOS

INO

PDF





17 comentários:

  1. Muito bacana, parabéns! Queria entender se tem como criar uma ação após a detecção de um rosto. Por exemplo, abrir uma porta. Obrigado pelos vídeos e excelente trabalho.

    ResponderExcluir
    Respostas
    1. Olá! Estou com o mesmo problema, você conseguiu implementar esse seu projeto?

      Excluir
    2. Olá Sanderson e Felipe, tudo bem? Vocês conseguiram realizar essa implementação? Estou pensando em fazer algo parecido, porém estou encontrando muitas dificuldades...

      Excluir
  2. Poderia fazer um projeto, explorar mais a placa ? quem sabe negar um acesso...

    ResponderExcluir
  3. Olá, alguém poderia me informar quais pinos desse módulo eu posso usar para conectar outros sensores, servos, etc ?

    ResponderExcluir
  4. Hi, thanks for explanation. I have ESP32cam and I want to use it as a alarm in my garage. Do you know how to record short video on SD card after motion detection ?

    ResponderExcluir
    Respostas
    1. You can use a Raspberry Pi running motionEye (https://github.com/ccrisan/motioneye) for detect motion and save video or images when motion is detected. Configuring motionEye you can connect the ESP32-CAM with http://ip_esp32cam:81/stream.

      Excluir
  5. Oi, sabe como posso fazer para testar se o rosto é reconhecido pela câmera, dai ele liga um led, se não reconhecer ele apaga, por exemplo?

    ResponderExcluir
    Respostas
    1. Olá, tudo bem? Vocês conseguiu realizar essa implementação? Estou pensando em fazer algo parecido, porém estou encontrando muitas dificuldades...

      Excluir
  6. Estou com um problema. Eu gravo e consigo ver o vídeo da camera do ESP, e também altero todas as configurações da camera, mas não está fazendo o reconhecimento facial.
    Testei com duas placas que tenho e acontece a mesma coisa nas duas placas.
    E sim, eu ativei o reconhecimento facial. O que há de errado?

    ResponderExcluir
    Respostas
    1. Oi estou com o mesmo problema, tenho cinco placas e em todas a mesma coisa, estou desconfiando do modelo da câmera porquê nenhuma delas é OV2640. Se conseguiu resolver, por favor comente

      Excluir
    2. estou com o mesmo problema, não faz o reconhecimento facial

      Excluir
    3. Você deve e ir "Ferramentas" > "Gerenciador de Placas" e procurar o ESP32, selecionar a versão 1.0.1 e instalar

      Excluir
  7. Oi, Usei minha câmera em uma rede tim 2.4/5Ghz porém não conecta, será que temos um problema com banda ja testei em outras operadora que funcionou corretamente, li o datasheet que indica 2.4 como usi mas não fala sobre routear banda automaticamente

    ResponderExcluir
  8. Oi estou com o mesmo problema, tenho cinco placas e em todas a mesma coisa, estou desconfiando do modelo da câmera porquê nenhuma delas é OV2640.

    ResponderExcluir
  9. Você deve e ir "Ferramentas" > "Gerenciador de Placas" e procurar o ESP32, selecionar a versão 1.0.1 e instalar

    ResponderExcluir
  10. Olá Ariel Sam . Tentei i stalar a versão 1.0.1 e o que acontece é que não mais aparece o skatch esp web connection e se eu tento colar o sckatch ele dá falha de esp_camera.h . Não sei mais por onde correr. Preciso resolver isso. Sinuca de bico por aqui. Roda perfeito mas não aparece a interface gráfica, quadrado de reconhecimento na face. Poderia me dar maiores dicas? Se possível alguém add meu zap seria legal pra me ajudar. 19 982568651 . Agradeço muito o apoio. Forte abraço. No aguardo

    ResponderExcluir

Tecnologia do Blogger.