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.
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.
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);
}
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.
-
Photo ESP32-CAM avec effet de niveaux de gris activé -
Photo ESP32-CAM avec luminosité réglée sur 2 -
ESP32-CAM avec Contraste réglé sur 2 et Saturation sur -2 -
Photo ESP32-CAM avec paramètres par défaut
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.
Emballer
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.