Weird behaviour with OV7725 camera

jbauerb1
Posts: 3
Joined: Sun Mar 17, 2024 2:12 am

Weird behaviour with OV7725 camera

Postby jbauerb1 » Sun Mar 17, 2024 2:26 am

Hi all, I'm trying to use a OV7725 camera and an AI-thinker esp32 cam board for a low-light camera project, however I'm having an issue trying to tune the camera sensor settings. If I set the set_gain_ctrl to 1 or don't specify it, the camera pushes ~31 fps in a light environment but drops down to ~4 as soon as it gets into a dark environment. This is kind of to be expected since I assume the camera is increasing gain/exposure/shutter time, however I cannot replicate this behaviour with manual settings. If I set_gain_ctrl to 1 then set set_agc_gain and set_aec_value to their maximums I still get ~30 fps. Really I'm just trying to figure out exactly what set_gain_ctrl does, since it seems like it does more then enable/disable auto gain. I'd like to figure this out since "enabling" auto gain control does result in a significantly better lowlight picture at a massive fps cost, so I want to manually set everything to strike a good balance between low light detail and fps. Here is how I'm setting my camera up:

Code: Select all

#include "esp_camera.h"
#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

double timeInit = 0;
double timeEnd;
double fps;

void setup() {
  cameraInit();
  Serial.begin(115200);
}

void cameraInit(){

  camera_config_t config;
  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_sccb_sda = SIOD_GPIO_NUM;
  config.pin_sccb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.frame_size = FRAMESIZE_240X240; // datasheet   
  config.pixel_format = PIXFORMAT_RGB565; // for streaming
  config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
  config.fb_location = CAMERA_FB_IN_PSRAM;
  config.jpeg_quality = 10; 
  config.fb_count = 2;

  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    return;
  }

  sensor_t *s = esp_camera_sensor_get();
  s->set_gain_ctrl(s, 1);                       // auto gain enabled (I think that's what it does)
  
}

void loop() {
  timeInit = millis();
  camera_fb_t * fb = esp_camera_fb_get();
  esp_camera_fb_return(fb);
  timeEnd = (millis() - timeInit) / 1000;
  fps = 1 / timeEnd;
  Serial.println(fps);
}
I took out everything non-related to the camera, if it doesn't compile I might have missed something. I've tried to use get_reg to look at some of the actual register values specified here: https://cdn.sparkfun.com/datasheets/Sen ... OV7725.pdf but I honestly don't know what to make of a lot of that. If anyone might know exactly what set_gain_ctrl affects that would be very helpful.

liaifat85
Posts: 200
Joined: Wed Dec 06, 2023 2:46 pm

Re: Weird behaviour with OV7725 camera

Postby liaifat85 » Sun Mar 17, 2024 11:04 am

The duration for which the camera's sensor is exposed to light. You can set this using the set_aec_value function.
The amplification of the signal. You can set this using the set_agc_gain function.

jbauerb1
Posts: 3
Joined: Sun Mar 17, 2024 2:12 am

Re: Weird behaviour with OV7725 camera

Postby jbauerb1 » Sun Mar 17, 2024 4:56 pm

Thats what I would think, but manually setting set_aec_value to 1200 and set_agc_gain to 30 (their supposed maximums) does not have the same affect. In fact it doesn't seem to affect the fps at all which makes me think it's not actually setting exposure and gain

jbauerb1
Posts: 3
Joined: Sun Mar 17, 2024 2:12 am

Re: Weird behaviour with OV7725 camera

Postby jbauerb1 » Sun Mar 17, 2024 7:33 pm

I figured out what set_gain_ctrl was doing that caused the fps drop: For some reason it was affecting auto framerate control (register E8) and setting the Auto frame rate max control to 1/8 frame reduction max. Not sure why gain control affects this. I'm also not sure why setting it to 1/8 frame reduction helps in dark environments so much, even if your setting exposure and gain seperately.

Who is online

Users browsing this forum: No registered users and 157 guests