Modifier les paramètres de la caméra ESP32-CAM OV2640 : luminosité, résolution, qualité, contraste, etc.

Modifier les paramètres de la caméra ESP32-CAM OV2640 : luminosité, résolution, qualité, contraste, etc.

Ce guide montre comment changer le ESP32-CAM OV2640 paramètres de l’appareil photo tels que le contraste, la luminosité, la résolution, la qualité, la saturation et plus encore à l’aide d’Arduino IDE.

Comment modifier les paramètres de la caméra ESP32-CAM contraste luminosité résolution qualité saturation exposition

Les instructions de ce didacticiel fonctionnent pour n’importe quelle carte de développement de caméra ESP32 tant qu’elle est fournie avec la caméra OV2640.

Vous aimerez peut-être lire : Meilleure carte de développement de caméra ESP32

Installation du module complémentaire ESP32

Nous allons programmer la carte ESP32 en utilisant Arduino IDE. Donc, vous avez besoin de l’IDE Arduino installé ainsi que du module complémentaire ESP32 :

Paramètres de la caméra OV2640

Dans le projet ESP32 Camera Web Server, le serveur Web a fourni de nombreuses options pour modifier les paramètres de l’image. Jetez un œil à la capture d’écran suivante – il y a des curseurs que vous pouvez déplacer pour modifier les paramètres de l’image.

Paramètres de la caméra OV2640 ESP32-CAM AI Thinker

Dans ce didacticiel, nous allons vous montrer comment implémenter ces modifications sur votre code quel que soit le projet que vous construisez : prendre des photos ou diffuser une vidéo.

Nous vous recommandons de suivre d’abord le projet Camera Web Server et de jouer avec les paramètres de l’image pour voir à quoi sert chaque paramètre :

Selon l’emplacement de votre appareil photo, vous souhaiterez peut-être modifier certains paramètres pour obtenir une meilleure image. Jouer avec ce serveur Web vous donne une idée de ce que vous devez changer et des valeurs que vous devez définir pour obtenir une meilleure image. Une fois que vous connaissez les meilleurs paramètres pour votre appareil photo, vous souhaiterez peut-être les appliquer à vos autres projets.

Modification des paramètres de la caméra ESP32-CAM Arduino Sketch

Pour modifier les paramètres de l’image, après avoir initialisé l’appareil photo, utilisez les lignes suivantes :

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

Le tableau suivant présente chaque fonction et les valeurs acceptées :

Une fonction Sens Valeurs
set_luminosité() Régler la luminosité -2 à 2
set_contraste() Définir le contraste -2 à 2
set_saturation() Définir la saturation -2 à 2
set_special_effect() Définir un effet spécial 0 – Aucun effet
1 – Négatif
2 – Niveaux de gris
3 – Teinte rouge
4 – Teinte verte
5 – Teinte bleue
6 – Sépia
set_whitebal() Régler la balance des blancs 0 – désactiver
1 – activer
set_awb_gain() Régler le gain de la balance des blancs 0 – désactiver
1 – activer
set_wb_mode() Définir le mode de balance des blancs 0 – Automatique
1 – Ensoleillé
2 – Nuageux
3 – Bureau
4 – Accueil
set_exposition_ctrl() Définir le contrôle de l’exposition 0 – désactiver
1 – activer
set_aec2() 0 – désactiver
1 – activer
set_ae_level() -2 à 2
set_aec_value() 0 à 1200
set_gain_ctrl() 0 – désactiver
1 – activer
set_agc_gain() 0 à 30
set_gainceiling() 0 à 6
set_bpc() 0 – désactiver
1 – activer
set_wpc() 0 – désactiver
1 – activer
set_raw_gma() 0 – désactiver
1 – activer
set_lenc() Régler la correction de l’objectif 0 – désactiver
1 – activer
set_hmirror() Miroir horizontal 0 – désactiver
1 – activer
set_vflip() Retournement vertical 0 – désactiver
1 – activer
set_dcw() 0 – désactiver
1 – activer
set_colorbar() Définir une barre de couleur 0 – désactiver
1 – activer

Comme vous pouvez le voir, la modification des paramètres de l’appareil photo est assez simple. Il vous suffit d’utiliser ces lignes de code après avoir initialisé la caméra. Après cela, vous pouvez utiliser les fonctions et le code habituels pour contrôler la caméra. Pour mieux comprendre comment les utiliser, vous pouvez suivre l’exemple suivant.

Les fonctions du tableau apparaissent dans le même ordre que dans l’exemple de Camera Web Server afin qu’il soit plus facile d’identifier les fonctions et les valeurs que vous devez utiliser pour obtenir une meilleure image dans votre scénario.

Exemple de modification des paramètres de la caméra ESP32-CAM

Pour vous montrer comment appliquer les paramètres d’image dans votre code, nous avons construit un exemple simple. Le code suivant prend une photo toutes les 10 secondes et l’enregistre sur la carte microSD. Il y a une section dans le code qui vous permet de modifier les paramètres de l’appareil photo.

/*********
  Rui Santos
  Complete project details at https://Raspberryme.com/esp32-cam-ov2640-camera-settings/
*********/

#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"

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

// 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 MicroSD
  Serial.print("Initializing the MicroSD card module... ");
  initMicroSDCard();
}

void loop() {
  //Path where new picture will be saved in SD Card
  String path = "/picture" + String(pictureNumber) +".jpg";  
  Serial.printf("Picture file name: %sn", 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_UXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
    config.jpeg_quality = 10; //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: %sn", path.c_str());
  }
  file.close();
  
  //return the frame buffer back to the driver for reuse
  esp_camera_fb_return(fb); 
}

Afficher le code brut

Pour simplifier les choses, nous avons créé une fonction appelée configInitCamera() qui contient toutes les commandes pour initialiser la caméra.

Attribution des GPIO OV2640

Tout d’abord, il commence par affecter les GPIO.

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;

La fréquence de la caméra :

config.xclk_freq_hz = 20000000;

Format d’image, qualité et taille d’image OV2640

Le format de l’image :

config.pixel_format = PIXFORMAT_JPEG; //YUV422,GRAYSCALE,RGB565,JPEG

Le format d’image peut être l’une des options suivantes :

  • PIXFORMAT_YUV422
  • PIXFORMAT_GRAYSCALE
  • PIXFORMAT_RGB565
  • PIXFORMAT_JPEG

Ensuite, définissez la taille de l’image, la qualité jpeg et le nombre de tampons d’images. Nous sélectionnons différents paramètres selon que vous utilisez un appareil photo avec ou sans PSRAM.

// Select lower framesize if the camera doesn't support PSRAM
if(psramFound()){
  config.frame_size = FRAMESIZE_UXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
  config.jpeg_quality = 10; //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;
}

La taille du cadre peut être définie sur l’une de ces options :

  • FRAMESIZE_UXGA (1600×1200)
  • FRAMESIZE_QVGA (320×240)
  • FRAMESIZE_CIF (352 x 288)
  • FRAMESIZE_VGA (640×480)
  • FRAMESIZE_SVGA (800×600)
  • FRAMESIZE_XGA (1024×768)
  • FRAMESIZE_SXGA (1280×1024)

La qualité de l’image (jpeg_qualité) peut être un nombre compris entre 0 et 63. Un nombre inférieur signifie une qualité supérieure. Cependant, des nombres très faibles pour la qualité d’image, en particulier à une résolution plus élevée, peuvent faire planter l’ESP32-CAM ou il peut ne pas être en mesure de prendre les photos correctement.

Donc, si vous remarquez que les images prises avec l’ESP32-CAM sont coupées en deux, ou avec des couleurs étranges, c’est probablement un signe que vous devez baisser la qualité (sélectionnez un nombre plus élevé).

Initialiser la caméra OV2640

Les lignes suivantes initialisent la caméra :

// 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;
}

Après cela, vous pouvez ajouter les lignes de code que nous vous avons montrées précédemment pour modifier les paramètres de l’image.

Paramètres OV2640 : luminosité, contraste, saturation, balance des blancs, exposition, etc.

Les valeurs définies sur les lignes suivantes sont les valeurs par défaut, vous pouvez les modifier pour modifier les paramètres de l’image.

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

Manifestation

Modifiez les paramètres de l’appareil photo dans le code pour ajuster l’image. Ensuite, téléchargez le code sur votre ESP32-CAM.

Appuyez sur le bouton ESP32-CAM RST et il commencera à prendre des photos. Ensuite, prenez la carte microSD pour voir les photos.

Ci-dessous, vous pouvez voir plusieurs images prises avec des paramètres différents.

A mon avis, dans ces conditions, les meilleurs réglages pour une meilleure image sont : le contraste réglé sur 2 et la saturation réglée sur -2.

Conclusion

Dans ce didacticiel, vous avez appris à modifier les paramètres de l’appareil photo pour ajuster l’image que vous obtenez avec l’appareil photo OV2640.

Cela peut être utile car selon l’endroit où vous placez votre appareil photo, vous devrez peut-être modifier les paramètres pour obtenir une meilleure image.

Vous pouvez utiliser les fonctions que nous vous avons montrées ici dans n’importe lequel de vos projets avec l’ESP32-CAM pour ajuster les paramètres. Nous avons plusieurs projets avec l’ESP32-CAM qui pourraient vous plaire :

Merci d’avoir lu.