Translate

Rabu, 17 Juli 2024

ESP32-CAM : Face Detected

 

Support : 
  • Link video 
Hardware :
  • ESP32-CAM
Fitur :
  • Mendeteksi wajah dengan esp32-cam
Note :
  • Atur Board esp32-cam ke versi 1.0.6

/*
    add    : Rahmat Fanshuri
    Versi  : 1.0
    Update : 17/JULI/2024
    code   : ESP32-CAM FACE DETECTED
    Note   : board esp32 versi 1.0.6
*/
//////////////////////////////////////////////////////////////////////////////////////////////
/* ---------- HEADER GLOGAL ----------------------------------------------------------------*/
#include "esp_camera.h"
#include "fd_forward.h"
#include "fr_forward.h"
#include "fr_flash.h"
/* ---------- Konfigurasi Global ----------------------------------------------------------*/
#define ledFlash 4

unsigned long currentMillis = 0;
unsigned long openedMillis = 0;
long interval = 5000;
unsigned int Status;

/* ---------- Konfigurasi Camera ----------------------------------------------------------*/
static inline mtmn_config_t app_mtmn_config() {
  mtmn_config_t mtmn_config = { 0 };
  mtmn_config.type = FAST;
  mtmn_config.min_face = 80;
  mtmn_config.pyramid = 0.707;
  mtmn_config.pyramid_times = 4;
  mtmn_config.p_threshold.score = 0.6;
  mtmn_config.p_threshold.nms = 0.7;
  mtmn_config.p_threshold.candidate_number = 20;
  mtmn_config.r_threshold.score = 0.7;
  mtmn_config.r_threshold.nms = 0.7;
  mtmn_config.r_threshold.candidate_number = 10;
  mtmn_config.o_threshold.score = 0.7;
  mtmn_config.o_threshold.nms = 0.7;
  mtmn_config.o_threshold.candidate_number = 1;
  return mtmn_config;
}

mtmn_config_t mtmn_config = app_mtmn_config();
static face_id_name_list st_face_list;
dl_matrix3du_t *image_matrix = NULL;
camera_fb_t *fb = NULL;
dl_matrix3du_t *aligned_face = dl_matrix3du_alloc(1, FACE_WIDTH, FACE_HEIGHT, 3);
///////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
  /* ---------- begin ------------------------------------- */
  Serial.begin(115200);
  Serial.println(F(" This ESP32-CAM"));
  /* ---------- setting I/O ------------------------------- */
  pinMode(ledFlash, OUTPUT);
  digitalWrite(ledFlash, 0);
  /* ---------- setting esp32-cam ------------------------- */
  while (true) {
    camera_config_t config;
    config.ledc_channel = LEDC_CHANNEL_0;
    config.ledc_timer = LEDC_TIMER_0;
    config.pin_d0 = 5;
    config.pin_d1 = 18;
    config.pin_d2 = 19;
    config.pin_d3 = 21;
    config.pin_d4 = 36;
    config.pin_d5 = 39;
    config.pin_d6 = 34;
    config.pin_d7 = 35;
    config.pin_xclk = 0;
    config.pin_pclk = 22;
    config.pin_vsync = 25;
    config.pin_href = 23;
    config.pin_sscb_sda = 26;
    config.pin_sscb_scl = 27;
    config.pin_pwdn = 32;
    config.pin_reset = -1;
    config.xclk_freq_hz = 20000000;
    config.pixel_format = PIXFORMAT_JPEG;
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
    /* ---------- check esp32-cam -------------------------- */
    esp_err_t err = esp_camera_init(&config);
    if (err != ESP_OK) {
      Serial.printf("Camera init failed with error 0x%x", err);
      ESP.restart();
      delay(5000);
    }
    sensor_t *s = esp_camera_sensor_get();
    s->set_framesize(s, FRAMESIZE_QVGA);
    break;
  }
  /* ---------- start ------------------------------------ */
  digitalWrite(ledFlash, 1);
  delay(1000);
  digitalWrite(ledFlash, 0);
}
///////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
  bool statusResult;
  statusResult = function_faceDetected();

  // jika wajah terdeteksi , tambahkan action yang di inginkan
  if (statusResult == true) {
    digitalWrite(ledFlash, 1);
    delay(1000);
    digitalWrite(ledFlash, 0);
  }
  delay(500);
}
///////////////////////////////////////////////////////////////////////////////////////////////
bool function_faceDetected() {
  bool faceRecognised = false;
  int64_t start_time = esp_timer_get_time();

  fb = esp_camera_fb_get();  // take img

  if (!fb) {
    Serial.println("Camera capture failed");
    return false;
  }

  int64_t fb_get_time = esp_timer_get_time();
  image_matrix = dl_matrix3du_alloc(1, fb->width, fb->height, 3);
  uint32_t res = fmt2rgb888(fb->buf, fb->len, fb->format, image_matrix->item);

  if (!res) {
    Serial.println("to rgb888 failed");
    dl_matrix3du_free(image_matrix);
  }

  esp_camera_fb_return(fb);
  box_array_t *net_boxes = face_detect(image_matrix, &mtmn_config);

  if (net_boxes) {
    if (align_face(net_boxes, image_matrix, aligned_face) == ESP_OK) {
      Serial.println("Face Detected");
      faceRecognised = 1;
    } else {
      Serial.println("Face Not Aligned");
    }
    // free(net_boxes->box);
    // free(net_boxes->landmark);
    // free(net_boxes);
  } else {
    Serial.println("No Face Detected");
  }
  dl_matrix3du_free(image_matrix);
  return faceRecognised;
}

Tidak ada komentar:

Posting Komentar