ESP32CAM : qualité sur server et SD

Bonjour à tous,

Voici un constat que j'aimerai comprendre au sujet de la qualité d'une photo enregistrée sur une carte MicroSD et une sur serveur ; ( par un ESP 32 Cam )
Mon but étant de regler la configuartion de la caméra pour un futur timelaps.

J'utilise le code " Camera Web Server " pour visualiser ma caméra en temps réel sur serveur afin de trouver les bons reglages pour une belle qualité photo.

Tout est OK, ensuite ;

J'ouvre mon code perso ( capture de photo toute les minutes avec enregistrement sur carte MicroSD ), je modifie les réglages photos et je lance la capture de photo.

Tout n'est pas OK ;

La qualité n'est pas bonne du tout.

Je me demande donc d'où cela peut provenir, mes hypoteses ;

  • Passant par un serveur, donc par un flux vidéos (au lieu d'un enregistrement), la qualité y est forcement mieux ?

  • La caméra s'allume au moment de la photo, peut être qu'elle n'a pas le "temps" de faire sa mise au point etc ... ?

Et vous, une idée ?

Bonjour

La qualité n'est pas bonne du tout.

la qualité médiocre me parait principalement imputable à la camera OV2640 et à sa focalisation réglée sur une distance courte , environ 1m (certains disent avoir fait sauter la colle empêchant la rotation l'objectif pour focaliser sur une distance autre)

peut être qu'elle n'a pas le "temps" de faire sa mise au point

pas de mise au point avec ESP32-CAM, c'est au sujet de se placer à 'la bonne distance' !

on commence à voir apparaître des associations ESP32 + OV5640 ( 5MP + autofocus ) , à suivre....

Dommage je n'ai pas pensé a faire une capture d'ecran de l'affichage de la caméra en temps réél, mais la qualité etait correct,

Voici quand je passe sur le programme de time laps : completement sur-exposé

Alors qu'en temps reel sur le serveur je vois très bien le sujet ( mini sapin de noel )

En regardant ce lien TUTO REGLAGE CAM ESP 32 pour les differents reglages de la caméra, on peut voir par exemple ;

  • set lenc : correction de l'objectif ( ON ou OFF )
  • set exposure ... : contrôle de l'exposition ( ON ou OFF )

J'ai l'impression que la cam fait quand même des ajustements auto. D'où ma seconde hypotese.

Bien sur j'ai essayé de modifier different reglage, rien n'y fait. ( pourtant la modification des reglages fonctionne, j'ai essayé en passant en sépia et cela marche )

Serait il possible d'allumer la caméra et 10 secondes après prendre la photo.
( En faite je ne sais pas trop, dans le code, si la caméra est constament allumée ou si elle s'allume au moment de la photo malgrès qu'elle soit allimentée)

j'ai également remarqué une première photo surexposée dans un timelapse, pas gênant dans mon cas, je n'ai pas cherché à supprimer le phénomène...... j'ai l''impression qu'un reglage auto de l'exposition est fait lors de la première prise de vues après mise sous tension (= reset de la camera)

Est-ce très gênant de devoir laisser de côté la première photo ?

Toutes mes photos sont comme ça.
Je pense que c'est ce reglage ( ou d'autre ) qui pose problème, même en le mettant sur OFF, cela me fait pareil.

Je pense que mon code doit faire un "reset" après chaque photo.

Tu as une idée ?

#include "esp_camera.h"
#include "FS.h"                // SD Card ESP32
#include "SD_MMC.h"            // SD Card ESP32
#include "soc/soc.h"           // Disable brownout problems
#include "soc/rtc_cntl_reg.h"  // Disable brownout problems
#include "driver/rtc_io.h"
#include "SPI.h"

#define MINUTES_BETWEEN_PHOTOS 1

// Pin definition for CAMERA_MODEL_AI_THINKER
// Change pin definition if you're using another ESP32 with camera module
#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
#define BUILTIN_LED 4

// Keep track of number of pictures
unsigned int pictureNumber = 0;

//Stores the camera configuration parameters
camera_config_t config;

void setup() {

  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
 
  Serial.begin(115200);
  
  //Initialize the camera  
  Serial.print("Initializing the camera module...");
  configInitCamera();
  Serial.println("Ok!");
 
  // Initialize the SD card
    if (!SD_MMC.begin("/sdcard", true)){
        Serial.println("Failed to mount SD card");
        return;
    }

    // Specify that LED pin
    pinMode(BUILTIN_LED, OUTPUT);
    digitalWrite(BUILTIN_LED, LOW);

    // Check for an SD card
    uint8_t cardType = SD_MMC.cardType();
    if (cardType == CARD_NONE){
        Serial.println("No SD card attached");
        return;
    }
}

void loop() {

  //Path where new picture will be saved in SD Card
  String path = "/picture" + String(pictureNumber) +".jpg";  
  Serial.printf("Picture file name: %s\n", path.c_str());

  //Take and Save Photo
  takeSavePhoto(path);
  pictureNumber++;
  delay(10000); 
  
}

void configInitCamera(){
  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; //YUV422,GRAYSCALE,RGB565,JPEG

  // Select lower framesize if the camera doesn't support PSRAM
  if(psramFound()){
    config.frame_size = FRAMESIZE_SXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
    config.jpeg_quality = 4; //10-63 lower number means higher quality
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }
  
  // Initialize the Camera
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  sensor_t * s = esp_camera_sensor_get();
  s->set_brightness(s, 0);     // -2 to 2
  s->set_contrast(s, 0);       // -2 to 2
  s->set_saturation(s, 0);     // -2 to 2
  s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia)
  s->set_whitebal(s, 1);       // 0 = disable , 1 = enable
  s->set_awb_gain(s, 1);       // 0 = disable , 1 = enable
  s->set_wb_mode(s, 0);        // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home)
  s->set_exposure_ctrl(s, 1);  // 0 = disable , 1 = enable
  s->set_aec2(s, 0);           // 0 = disable , 1 = enable
  s->set_ae_level(s, 0);       // -2 to 2
  s->set_aec_value(s, 300);    // 0 to 1200
  s->set_gain_ctrl(s, 1);      // 0 = disable , 1 = enable
  s->set_agc_gain(s, 0);       // 0 to 30
  s->set_gainceiling(s, (gainceiling_t)0);  // 0 to 6
  s->set_bpc(s, 0);            // 0 = disable , 1 = enable
  s->set_wpc(s, 1);            // 0 = disable , 1 = enable
  s->set_raw_gma(s, 1);        // 0 = disable , 1 = enable
  s->set_lenc(s, 1);           // 0 = disable , 1 = enable
  s->set_hmirror(s, 0);        // 0 = disable , 1 = enable
  s->set_vflip(s, 0);          // 0 = disable , 1 = enable
  s->set_dcw(s, 1);            // 0 = disable , 1 = enable
  s->set_colorbar(s, 0);       // 0 = disable , 1 = enable
}

void initMicroSDCard(){
  // Start Micro SD card
  Serial.println("Starting SD Card");
  if(!SD_MMC.begin()){
    Serial.println("SD Card Mount Failed");
    return;
  }
  uint8_t cardType = SD_MMC.cardType();
  if(cardType == CARD_NONE){
    Serial.println("No SD Card attached");
    return;
  }
}

void takeSavePhoto(String path){
  // Take Picture with Camera
  camera_fb_t  * fb = esp_camera_fb_get();

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

  // Save picture to microSD card
  fs::FS &fs = SD_MMC; 
  File file = fs.open(path.c_str(), FILE_WRITE);
  if(!file){
    Serial.println("Failed to open file in writing mode");
  } 
  else {
    file.write(fb->buf, fb->len); // payload (image), payload length
    Serial.printf("Saved file to path: %s\n", path.c_str());
  }
  file.close();
  
  //return the frame buffer back to the driver for reuse
  esp_camera_fb_return(fb); 

  // Delay until the next photo

  delay(MINUTES_BETWEEN_PHOTOS * 1 * 1000);
  
}

D'après le schéma de la carte ESP32-CAM le Reset physique de la camera est câblé en direct à partir de la tension d'alimentation 3,3V. Il n'est pas géré par un GPIO de l'ESP32.

Une alim un peu faiblarde pourrait donc resetter involontairement la caméra si la tension 3,3V chute un peu trop à chaque prise de vue (prise de vue avec ou sans 'flash' ?)

Non j’ai inhibé la LED.
J’avais fais le test avec l’ESP branché a mon PC.
Tu penses que ça peut faire une baisse de tension par le PC ?

C’est vrai qu’il doit fonctionner avec une tension de 5V normalement

J’ai cette alim aussi, les 3 port seront utilisés


Il existe un modele OV2640 qui est grand angle (120° et plus). J’en ai un en commande.
Plus l’angle est élevé, plus la profondeur de champ (zone nette) est grande mais plus le sujet est petit : toujours le même dilemme le beurre ou l’argent du beurre.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.