How To Get Camera To Change Sfm
This guide shows how to modify the ESP32-CAM OV2640 photographic camera settings such as dissimilarity, brightness, resolution, quality, saturation and more using Arduino IDE.
The instructions in this tutorial work for any ESP32 photographic camera development board as long as it comes with the OV2640 camera.
You may like reading: Best ESP32 Camera Development Board
Installing the ESP32 add-on
We'll program the ESP32 lath using Arduino IDE. So, y'all need the Arduino IDE installed as well as the ESP32 add-on:
- Installing the ESP32 Board in Arduino IDE (Windows, Mac Os Ten, Linux)
OV2640 Camera Settings
In the ESP32 Camera Web Server project, the web server provided a lot of options to change the paradigm settings. Accept a look at the post-obit screenshot – at that place are sliders that yous can motion to modify the image settings.
In this tutorial we'll bear witness you how to implement those changes on your code regardless of the project you're building: taking photos or streaming video.
We recommend that you follow the Photographic camera Web Server projection offset and play with the image settings to see what each setting does:
- ESP32-CAM Video Streaming and Face Recognition with Arduino IDE
Depending on where your photographic camera is located, you may want to change some settings to become a better film. Playing with that web server gives you an idea of what you need to modify and what values you lot need to set to become a improve movie. Once you know the best settings for your camera, you lot may want to employ them in your other projects.
Changing ESP32-CAM Photographic camera Settings Arduino Sketch
To change the image settings, after initializing the camera, utilise the following lines:
sensor_t * s = esp_camera_sensor_get() s->set_brightness(s, 0); // -ii to 2 southward->set_contrast(s, 0); // -2 to two s->set_saturation(s, 0); // -2 to 2 s->set_special_effect(s, 0); // 0 to 6 (0 - No Result, i - Negative, ii - Grayscale, 3 - Cherry Tint, 4 - Greenish Tint, 5 - Bluish Tint, 6 - Sepia) s->set_whitebal(s, 1); // 0 = disable , one = enable south->set_awb_gain(s, 1); // 0 = disable , 1 = enable due south->set_wb_mode(s, 0); // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, ii - Cloudy, 3 - Office, four - Dwelling) south->set_exposure_ctrl(due south, i); // 0 = disable , 1 = enable southward->set_aec2(s, 0); // 0 = disable , i = enable s->set_ae_level(s, 0); // -ii to 2 s->set_aec_value(south, 300); // 0 to 1200 south->set_gain_ctrl(s, 1); // 0 = disable , 1 = enable south->set_agc_gain(s, 0); // 0 to xxx s->set_gainceiling(due south, (gainceiling_t)0); // 0 to 6 s->set_bpc(due south, 0); // 0 = disable , 1 = enable s->set_wpc(southward, 1); // 0 = disable , 1 = enable s->set_raw_gma(s, 1); // 0 = disable , 1 = enable due south->set_lenc(south, 1); // 0 = disable , 1 = enable s->set_hmirror(s, 0); // 0 = disable , i = enable southward->set_vflip(s, 0); // 0 = disable , 1 = enable south->set_dcw(south, 1); // 0 = disable , ane = enable due south->set_colorbar(s, 0); // 0 = disable , 1 = enable The post-obit table shows each role and the values accustomed:
| Role | Meaning | Values |
| set_brightness() | Set effulgence | -two to 2 |
| set_contrast() | Set up dissimilarity | -2 to 2 |
| set_saturation() | Set saturation | -2 to 2 |
| set_special_effect() | Set a special effect | 0 – No Consequence 1 – Negative 2 – Grayscale 3 – Red Tint four – Dark-green Tint five – Bluish Tint half dozen – Sepia |
| set_whitebal() | Set white rest | 0 – disable i – enable |
| set_awb_gain() | Set white balance gain | 0 – disable one – enable |
| set_wb_mode() | Set white balance fashion | 0 – Auto ane – Sunny 2 – Cloudy 3 – Office 4 – Dwelling |
| set_exposure_ctrl() | Ready exposure control | 0 – disable 1 – enable |
| set_aec2() | 0 – disable one – enable | |
| set_ae_level() | -two to 2 | |
| set_aec_value() | 0 to 1200 | |
| set_gain_ctrl() | 0 – disable one – enable | |
| set_agc_gain() | 0 to xxx | |
| set_gainceiling() | 0 to half-dozen | |
| set_bpc() | 0 – disable 1 – enable | |
| set_wpc() | 0 – disable 1 – enable | |
| set_raw_gma() | 0 – disable one – enable | |
| set_lenc() | Prepare lens correction | 0 – disable 1 – enable |
| set_hmirror() | Horizontal mirror | 0 – disable 1 – enable |
| set_vflip() | Vertical flip | 0 – disable 1 – enable |
| set_dcw() | 0 – disable 1 – enable | |
| set_colorbar() | Set a colorbar | 0 – disable 1 – enable |
Every bit you lot can see, changing the camera settings is pretty straightforward. You just need to utilize those lines of code after initializing the photographic camera. After that, you tin can use the usual functions and code to command the camera. To amend understand how to apply them, you tin can follow the next case.
The functions in the table appear in the same order equally in the Camera Web Server instance and so that it is easier to identify which functions and values y'all should apply to go a improve image in your scenario.
Changing ESP32-CAM Camera Settings Example
To prove you how to apply the image settings in your code, we've built a elementary example. The following code takes a photo every 10 seconds and saves it in the microSD carte du jour. There'due south a section in the code that allows you to change the camera settings.
/********* Rui Santos Complete projection details at https://RandomNerdTutorials.com/esp32-cam-ov2640-camera-settings/ *********/ #include "esp_camera.h" #include "FS.h" // SD Bill of fare ESP32 #include "SD_MMC.h" // SD Card ESP32 #include "soc/soc.h" // Disable brownout problems #include "soc/rtc_cntl_reg.h" // Disable brownout bug #include "driver/rtc_io.h" // Pin definition for CAMERA_MODEL_AI_THINKER // Alter pin definition if yous'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 #ascertain Y8_GPIO_NUM 34 #ascertain Y7_GPIO_NUM 39 #define Y6_GPIO_NUM 36 #define Y5_GPIO_NUM 21 #define Y4_GPIO_NUM xix #ascertain Y3_GPIO_NUM 18 #ascertain Y2_GPIO_NUM five #ascertain VSYNC_GPIO_NUM 25 #define HREF_GPIO_NUM 23 #define PCLK_GPIO_NUM 22 // Continue runway 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.brainstorm(115200); //Initialize the camera Serial.print("Initializing the camera module..."); configInitCamera(); Series.println("Ok!"); //Initialize MicroSD Series.print("Initializing the MicroSD card module... "); initMicroSDCard(); } void loop() { //Path where new picture will be saved in SD Card Cord path = "/picture" + String(pictureNumber) +".jpg"; Serial.printf("Flick file name: %south\n", path.c_str()); //Have 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 back up 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 = ane; } // Initialize the Photographic 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 south->set_contrast(s, 0); // -ii to two due south->set_saturation(s, 0); // -ii to 2 s->set_special_effect(s, 0); // 0 to half dozen (0 - No Result, i - Negative, ii - Grayscale, 3 - Red Tint, 4 - Green Tint, v - Blue Tint, half dozen - Sepia) s->set_whitebal(s, i); // 0 = disable , 1 = enable southward->set_awb_gain(s, 1); // 0 = disable , 1 = enable southward->set_wb_mode(s, 0); // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Dwelling house) s->set_exposure_ctrl(s, 1); // 0 = disable , i = enable due south->set_aec2(due south, 0); // 0 = disable , 1 = enable southward->set_ae_level(s, 0); // -2 to ii due south->set_aec_value(s, 300); // 0 to 1200 due south->set_gain_ctrl(s, i); // 0 = disable , 1 = enable s->set_agc_gain(s, 0); // 0 to xxx southward->set_gainceiling(s, (gainceiling_t)0); // 0 to half dozen due south->set_bpc(s, 0); // 0 = disable , ane = enable s->set_wpc(south, ane); // 0 = disable , i = enable due south->set_raw_gma(s, ane); // 0 = disable , 1 = enable south->set_lenc(s, ane); // 0 = disable , 1 = enable s->set_hmirror(due south, 0); // 0 = disable , ane = enable s->set_vflip(due south, 0); // 0 = disable , 1 = enable s->set_dcw(southward, one); // 0 = disable , 1 = enable south->set_colorbar(due south, 0); // 0 = disable , 1 = enable } void initMicroSDCard(){ // Commencement Micro SD card Serial.println("Starting SD Carte du jour"); 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"); render; } } void takeSavePhoto(String path){ // Take Picture with Camera camera_fb_t * fb = esp_camera_fb_get(); if(!fb) { Series.println("Camera capture failed"); return; } // Save moving 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 up file in writing mode"); } else { file.write(fb->buf, fb->len); // payload (image), payload length Serial.printf("Saved file to path: %s\north", path.c_str()); } file.shut(); //return the frame buffer back to the driver for reuse esp_camera_fb_return(fb); } View raw lawmaking
To makes things simpler, we've created a part called configInitCamera() that contains all the commands to initialize the camera.
Assigning OV2640 GPIOs
Showtime, it starts by assigning the GPIOs.
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; The camera frequency:
config.xclk_freq_hz = 20000000; OV2640 prototype format, quality, and frame size
The prototype format:
config.pixel_format = PIXFORMAT_JPEG; //YUV422,GRAYSCALE,RGB565,JPEG The image format can exist one of the post-obit options:
- PIXFORMAT_YUV422
- PIXFORMAT_GRAYSCALE
- PIXFORMAT_RGB565
- PIXFORMAT_JPEG
Then, set the frame size, jpeg quality and framebuffer count. We select different settings depending if you lot're using a photographic camera with PSRAM or without PSRAM.
// Select lower framesize if the photographic camera doesn't back up PSRAM if(psramFound()){ config.frame_size = FRAMESIZE_UXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA config.jpeg_quality = x; //10-63 lower number means higher quality config.fb_count = 2; } else { config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 12; config.fb_count = one; } The frame size can be set up to one of these options:
- FRAMESIZE_UXGA (1600 10 1200)
- FRAMESIZE_QVGA (320 10 240)
- FRAMESIZE_CIF (352 x 288)
- FRAMESIZE_VGA (640 10 480)
- FRAMESIZE_SVGA (800 x 600)
- FRAMESIZE_XGA (1024 10 768)
- FRAMESIZE_SXGA (1280 x 1024)
The prototype quality (jpeg_quality) tin exist a number between 0 and 63. A lower number means a college quality. However, very low numbers for paradigm quality, specially at higher resolution can make the ESP32-CAM to crash or it may not be able to accept the photos properly.
And so, if you lot notice that the images taken with the ESP32-CAM are cut in one-half, or with strange colors, that's probably a sign that you need to lower the quality (select a college number).
Initialize OV2640 photographic camera
The following lines initialize the camera:
// Initialize the Camera esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%10", err); return; } After this, you lot tin can add the lines of code nosotros've shown you previously to modify the epitome settings.
OV2640 settings: brightness, contrast, saturation, white balance, exposure, and more
The values assault the following lines are the default values, you can change them to alter the epitome settings.
sensor_t * southward = esp_camera_sensor_get(); s->set_brightness(s, 0); // -2 to 2 s->set_contrast(southward, 0); // -ii to 2 s->set_saturation(due south, 0); // -2 to ii s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, one - Negative, two - Grayscale, iii - Red Tint, iv - Green Tint, 5 - Bluish Tint, 6 - Sepia) s->set_whitebal(south, ane); // 0 = disable , ane = enable s->set_awb_gain(s, 1); // 0 = disable , 1 = enable s->set_wb_mode(due south, 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(south, 0); // 0 = disable , 1 = enable southward->set_ae_level(south, 0); // -2 to ii s->set_aec_value(s, 300); // 0 to 1200 due south->set_gain_ctrl(south, ane); // 0 = disable , 1 = enable s->set_agc_gain(southward, 0); // 0 to xxx s->set_gainceiling(s, (gainceiling_t)0); // 0 to 6 s->set_bpc(southward, 0); // 0 = disable , 1 = enable s->set_wpc(south, 1); // 0 = disable , 1 = enable south->set_raw_gma(s, 1); // 0 = disable , 1 = enable s->set_lenc(s, one); // 0 = disable , 1 = enable s->set_hmirror(s, 0); // 0 = disable , 1 = enable s->set_vflip(southward, 0); // 0 = disable , 1 = enable s->set_dcw(s, ane); // 0 = disable , one = enable s->set_colorbar(due south, 0); // 0 = disable , i = enable Demonstration
Alter the camera settings in the code to arrange the image. Then, upload the code to your ESP32-CAM.
Printing the ESP32-CAM RST button, and it will get-go taking photos. Then, grab the microSD card to see the photos.
Beneath you can see several images taken with unlike settings.
-
ESP32-CAM Photo with Grayscale effect enabled -
ESP32-CAM Photo with Brightness prepare to two -
ESP32-CAM with Contrast set up to 2 and Saturation to -ii -
ESP32-CAM Photo with Default Settings
In my opinion, in these conditions, the best settings for a amend moving-picture show are: contrast prepare to two and saturation set to -2.
Wrapping Upward
In this tutorial, you've learned how to change the photographic camera settings to suit the epitome y'all get with the OV2640 camera.
This can be useful considering depending on where you identify your photographic camera you lot may need to change the settings to get a better prototype.
You tin can use the functions nosotros've shown you here in any of your projects with the ESP32-CAM to conform the settings. We have several projects with the ESP32-CAM that y'all may like:
- Video Streaming, Face Detection and Confront Recognition
- ESP32 IP CAM – Video Streaming (Home Assistant and Node-RED)
- Take Photo and Save to MicroSD Carte du jour
- PIR Motion Detector with Photo Capture
- Take Photo, Salve to SPIFFS and Display in Web Server
- Build ESP32-CAM Projects (eBook)
- Read all our ESP32-CAM Projects, Tutorials and Guides
Thanks for reading.
Source: https://randomnerdtutorials.com/esp32-cam-ov2640-camera-settings/
Posted by: lewisvengland.blogspot.com

0 Response to "How To Get Camera To Change Sfm"
Post a Comment