欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > ESP32-S3模组上跑通esp32-camera(10)

ESP32-S3模组上跑通esp32-camera(10)

2025/2/21 3:35:50 来源:https://blog.csdn.net/phmatthaus/article/details/143635415  浏览:    关键词:ESP32-S3模组上跑通esp32-camera(10)

接前一篇文章:ESP32-S3模组上跑通esp32-camera(9)

 

本文内容参考:

esp32-camera入门(基于ESP-IDF)_esp32 camera-CSDN博客

OV5640手册解读-CSDN博客

ESP32_CAM CameraWebServer例程源码解析笔记(一)_void startcameraserver();-CSDN博客

特此致谢!

 

一、OV5640初始化

1. 配置接线和驱动

#include "esp_camera.h"//WROVER-KIT PIN Map
#define CAM_PIN_PWDN    -1 //power down is not used
#define CAM_PIN_RESET   -1 //software reset will be performed
#define CAM_PIN_XCLK    21
#define CAM_PIN_SIOD    26
#define CAM_PIN_SIOC    27#define CAM_PIN_D7      35
#define CAM_PIN_D6      34
#define CAM_PIN_D5      39
#define CAM_PIN_D4      36
#define CAM_PIN_D3      19
#define CAM_PIN_D2      18
#define CAM_PIN_D1       5
#define CAM_PIN_D0       4
#define CAM_PIN_VSYNC   25
#define CAM_PIN_HREF    23
#define CAM_PIN_PCLK    22static camera_config_t camera_config = {.pin_pwdn  = CAM_PIN_PWDN,.pin_reset = CAM_PIN_RESET,.pin_xclk = CAM_PIN_XCLK,.pin_sccb_sda = CAM_PIN_SIOD,.pin_sccb_scl = CAM_PIN_SIOC,.pin_d7 = CAM_PIN_D7,.pin_d6 = CAM_PIN_D6,.pin_d5 = CAM_PIN_D5,.pin_d4 = CAM_PIN_D4,.pin_d3 = CAM_PIN_D3,.pin_d2 = CAM_PIN_D2,.pin_d1 = CAM_PIN_D1,.pin_d0 = CAM_PIN_D0,.pin_vsync = CAM_PIN_VSYNC,.pin_href = CAM_PIN_HREF,.pin_pclk = CAM_PIN_PCLK,.xclk_freq_hz = 20000000,//EXPERIMENTAL: Set to 16MHz on ESP32-S2 or ESP32-S3 to enable EDMA mode.ledc_timer = LEDC_TIMER_0,.ledc_channel = LEDC_CHANNEL_0,.pixel_format = PIXFORMAT_JPEG,//YUV422,GRAYSCALE,RGB565,JPEG.frame_size = FRAMESIZE_UXGA,//QQVGA-UXGA, For ESP32, do not use sizes above QVGA when not JPEG. The performance of the ESP32-S series has improved a lot, but JPEG mode always gives better frame rates..jpeg_quality = 12, //0-63, for OV series camera sensors, lower number means higher quality.fb_count = 1, //When jpeg mode is used, if fb_count more than one, the driver will work in continuous mode..grab_mode = CAMERA_GRAB_WHEN_EMPTY//CAMERA_GRAB_LATEST. Sets when buffers should be filled
};esp_err_t camera_init(){//power up the camera if PWDN pin is definedif(CAM_PIN_PWDN != -1){pinMode(CAM_PIN_PWDN, OUTPUT);digitalWrite(CAM_PIN_PWDN, LOW);}//initialize the cameraesp_err_t err = esp_camera_init(&camera_config);if (err != ESP_OK) {ESP_LOGE(TAG, "Camera Init Failed");return err;}return ESP_OK;
}esp_err_t camera_capture(){//acquire a framecamera_fb_t * fb = esp_camera_fb_get();if (!fb) {ESP_LOGE(TAG, "Camera Capture Failed");return ESP_FAIL;}//replace this with your own functionprocess_image(fb->width, fb->height, fb->format, fb->buf, fb->len);//return the frame buffer back to the driver for reuseesp_camera_fb_return(fb);return ESP_OK;
}

上一回讲解了camera_config_t中与图像质量和帧缓冲相关的成员,本回继续解析其它成员。为了便于理解和回顾,再次贴出camera_config_t的定义,在components\esp32-camera\driver\include\esp_camera.h中,如下:

/*** @brief Configuration structure for camera initialization*/
typedef struct {int pin_pwdn;                   /*!< GPIO pin for camera power down line */int pin_reset;                  /*!< GPIO pin for camera reset line */int pin_xclk;                   /*!< GPIO pin for camera XCLK line */union {int pin_sccb_sda;           /*!< GPIO pin for camera SDA line */int pin_sscb_sda __attribute__((deprecated("please use pin_sccb_sda instead")));           /*!< GPIO pin for camera SDA line (legacy name) */};union {int pin_sccb_scl;           /*!< GPIO pin for camera SCL line */int pin_sscb_scl __attribute__((deprecated("please use pin_sccb_scl instead")));           /*!< GPIO pin for camera SCL line (legacy name) */};int pin_d7;                     /*!< GPIO pin for camera D7 line */int pin_d6;                     /*!< GPIO pin for camera D6 line */int pin_d5;                     /*!< GPIO pin for camera D5 line */int pin_d4;                     /*!< GPIO pin for camera D4 line */int pin_d3;                     /*!< GPIO pin for camera D3 line */int pin_d2;                     /*!< GPIO pin for camera D2 line */int pin_d1;                     /*!< GPIO pin for camera D1 line */int pin_d0;                     /*!< GPIO pin for camera D0 line */int pin_vsync;                  /*!< GPIO pin for camera VSYNC line */int pin_href;                   /*!< GPIO pin for camera HREF line */int pin_pclk;                   /*!< GPIO pin for camera PCLK line */int xclk_freq_hz;               /*!< Frequency of XCLK signal, in Hz. EXPERIMENTAL: Set to 16MHz on ESP32-S2 or ESP32-S3 to enable EDMA mode */ledc_timer_t ledc_timer;        /*!< LEDC timer to be used for generating XCLK  */ledc_channel_t ledc_channel;    /*!< LEDC channel to be used for generating XCLK  */pixformat_t pixel_format;       /*!< Format of the pixel data: PIXFORMAT_ + YUV422|GRAYSCALE|RGB565|JPEG  */framesize_t frame_size;         /*!< Size of the output image: FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA  */int jpeg_quality;               /*!< Quality of JPEG output. 0-63 lower means higher quality  */size_t fb_count;                /*!< Number of frame buffers to be allocated. If more than one, then each frame will be acquired (double speed)  */camera_fb_location_t fb_location; /*!< The location where the frame buffer will be allocated */camera_grab_mode_t grab_mode;   /*!< When buffers should be filled */
#if CONFIG_CAMERA_CONVERTER_ENABLEDcamera_conv_mode_t conv_mode;   /*!< RGB<->YUV Conversion mode */
#endifint sccb_i2c_port;              /*!< If pin_sccb_sda is -1, use the already configured I2C bus by number */
} camera_config_t;

接下来关注以下成员:

typedef struct {……camera_grab_mode_t grab_mode;   /*!< When buffers should be filled */
#if CONFIG_CAMERA_CONVERTER_ENABLEDcamera_conv_mode_t conv_mode;   /*!< RGB<->YUV Conversion mode */
#endifint sccb_i2c_port;              /*!< If pin_sccb_sda is -1, use the already configured I2C bus by number */……
} camera_config_t;
  • camera_grab_mode_t grab_mode

设置图像数据的抓取模式。上边示例代码中设置为CAMERA_GRAB_WHEN_EMPTY,表示在缓冲区为空时抓取图像。

    .grab_mode = CAMERA_GRAB_WHEN_EMPTY//CAMERA_GRAB_LATEST. Sets when buffers should be filled

camera_grab_mode_t的定义在components\esp32-camera\driver\include\esp_camera.h中,如下:

/*** @brief Configuration structure for camera initialization*/
typedef enum {CAMERA_GRAB_WHEN_EMPTY,         /*!< Fills buffers when they are empty. Less resources but first 'fb_count' frames might be old */CAMERA_GRAB_LATEST              /*!< Except when 1 frame buffer is used, queue will always contain the last 'fb_count' frames */
} camera_grab_mode_t;

可见,camera_grab_mode_t为枚举类型,包含了两个枚举值:

  • CAMERA_GRAB_WHEN_EMPTY:当缓冲区为空时填充缓冲区。(占用)资源更少,但第一个“fb_count”帧可能是旧的。
  • CAMERA_GRAB_LATEST:除非使用1帧缓冲区,否则队列将始终包含最后的“fb_count”帧。

 

  • camera_conv_mode_t conv_mode

RGB<->YUV转换模式。上边示例代码中并为赋值。注意,此成员是有条件的,必须在CONFIG_CAMERA_CONVERTER_ENABLED宏为非零值的时候才会存在。

camera_conv_mode_t的定义在components\esp32-camera\driver\include\esp_camera.h中,如下:

#if CONFIG_CAMERA_CONVERTER_ENABLED
/*** @brief Camera RGB\YUV conversion mode*/
typedef enum {CONV_DISABLE,RGB565_TO_YUV422,YUV422_TO_RGB565,YUV422_TO_YUV420
} camera_conv_mode_t;
#endif

CONFIG_CAMERA_CONVERTER_ENABLED是在menuconfig中定义的,默认并不选择。

  • int sccb_i2c_port

如果pin_sccb_sda为-1,则按编号使用已配置的I2C总线。

8521567084d84c52a16f0c8b964cfbb2.png

至此,camera_config_t结构及其实例camera_config的最后一段代码就解析完了,整个结构体也就都讲解完了。下一回开始正式解析函数代码。

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词