Taking a picture with ESP32

A project log for FaceLock: A Facial Recognition Door Lock

An ESP32 based IoT project.

xli89xli89 06/10/2020 at 21:120 Comments

The project has already been worked on for about a quarter now as a electronic system design course project by me. I will try to post things I did so far and some important notes here.

Taking a Picture

Taking a Picture with ESP32 CAM Module is a relatively simple procedure. All the pin setups are included in the examples they provided. Simply copy that and you will be ready to use the camera. 

// ESP32 Camera library
#include "esp_camera.h"

// ESP32 CAM module camera pin definition
#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

// Camera pin and image quality configuration 
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_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; 
  config.jpeg_quality = 10;
  config.fb_count = 2;
  config.frame_size = FRAMESIZE_SVGA;
  config.jpeg_quality = 12;
  config.fb_count = 1;

 In the camera configuration section, the resolution and quality of the image can be adjusted. To optimize the frame rate of the video stream, the resolution and quality should be set to as low as acceptable. 

Getting the image frame is done by calling the esp_camera_fb_get() function. This function returns a pointer to the frame buffer. The data structure of the frame buffer is shown in Figure 6. By first declaring an empty pointer to a frame buffer struct, and assigning the returned frame buffer pointer to this pointer, the frame is then obtained. 

camera_fb_t * fb = NULL;
fb = esp_camera_fb_get();

 The frame buffer struct looks like this:

 * @brief Data structure of camera frame buffer
typedef struct {
    uint8_t * buf;              /*!< Pointer to the pixel data */
    size_t len;                 /*!< Length of the buffer in bytes */
    size_t width;               /*!< Width of the buffer in pixels */
    size_t height;              /*!< Height of the buffer in pixels */
    pixformat_t format;         /*!< Format of the pixel data */
} camera_fb_t;