esp32-camera入门(基于ESP-IDF)

news/2024/10/7 16:59:02 标签: 嵌入式硬件

主要参考资料:
ESP32-S2 Kaluga camera + lcd 示例入门: https://blog.csdn.net/Marchtwentytwo/article/details/121121028
摄像头应用方案常见问题汇总: https://docs.espressif.com/projects/esp-faq/zh_CN/latest/application-solution/camera-application.html

目录

  • 一、camera初始化
    • 1.配置接线和驱动
    • 2.相机初始化 并 配置图像传感器
  • 二、传输camera 到 lcd 显示

一、camera初始化

1.配置接线和驱动

static camera_config_t camera_config = {
    .pin_pwdn = CAM_PIN_PWDN,
    .pin_reset = CAM_PIN_RESET,
    .pin_xclk = CAM_PIN_XCLK,
    .pin_sscb_sda = CAM_PIN_SIOD,
    .pin_sscb_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, //XCLK 20MHz or 10MHz for OV2640 double FPS (Experimental)
    .ledc_timer = LEDC_TIMER_0,	//ledc定时器用于生成XCLK
    .ledc_channel = LEDC_CHANNEL_0,
    .pixel_format = PIXFORMAT_RGB565, //YUV422,GRAYSCALE,RGB565,JPEG
    .frame_size = FRAMESIZE_QVGA,     //QQVGA-UXGA Do not use sizes above QVGA when not JPEG FRAMESIZE_QVGA
    .jpeg_quality = 12,               //0-63 lower number means higher quality
    .fb_count = 2,                    //控制使用 framebuffer 的个数,个数越多消耗内存越大。其值大于 2 时,获取的一帧图像可能不是实时的。仅与JPEG一起使用。
    .fb_location = CAMERA_FB_IN_PSRAM,//存放在外部PSRAM中,还可选择内部DRAM
    .grab_mode = CAMERA_GRAB_WHEN_EMPTY//当缓冲区为空时填充缓冲区。资源较少,但第一个'fb_count'帧可能是旧的
};

2.相机初始化 并 配置图像传感器

void app_camera_init()
{
    // camera init
    esp_err_t err = esp_camera_init(&camera_config);
    if (err != ESP_OK)
    {
        ESP_LOGE(TAG, "Camera init failed with error 0x%x", err);
        return;
    }
    
    //配置图像传感器
    sensor_t *s = esp_camera_sensor_get();
    s->set_vflip(s, 0);
    s->set_hmirror(s, 1);
}

二、传输camera 到 lcd 显示

可以看到 camera 示例 里对应的代码如下:

    while (1) {
        camera_fb_t *pic = esp_camera_fb_get();
        if (pic) {
            ESP_LOGI(TAG, "picture: %d x %d %dbyte", pic->width, pic->height, pic->len);
            lcd_set_index(0, 0, pic->width - 1, pic->height - 1);
#ifdef CONFIG_CAMERA_JPEG_MODE
            jpg2rgb565(pic->buf, pic->len, rgb565, JPG_SCALE_NONE);
            lcd_write_data(rgb565, 2 * (pic->width * pic->height));
#else
            lcd_write_data(pic->buf, pic->len);
#endif
            esp_camera_fb_return(pic);
        } else {
            ESP_LOGE(TAG, "Get frame failed");
        }
    }

这部分就是经过封装的 API 调用。先调用 esp_camera_fb_get 获取 camera 拍摄的数据,然后通过 lcd_set_index 设置 lcd 的起始和结束地址。之后将 camera 拍摄到的数据通过 lcd_write_data 来让 lcd 显示出来,最后使用 esp_camera_fb_return 释放 camera 使用的 buffer 来方便后续重复利用。


http://www.niftyadmin.cn/n/5693089.html

相关文章

【Linux-基础IO】磁盘的存储管理详解

磁盘的存储管理 由于一个磁盘中包含了大量的扇区,为了方便管理,我们对磁盘进行了分区,其中每个分区又进一步划分为多个块组(Block Group),每个块组中包含该块组的数据存储情况以及具体的数据 假设有一个8…

MobX-Miniprogram:微信小程序的状态管理利器

MobX-Miniprogram:微信小程序的状态管理利器 在开发微信小程序时,随着应用复杂度的提升,状态管理成为了一个不可忽视的问题。传统的通过全局变量或wx.setStorageSync/wx.getStorageSync进行状态管理的方式,不仅代码可读性差&…

进程间通信——《匿名管道》

文章目录 前言:进程间通信介绍进程间通信目的进程之间如何通信?进程间通信分类 管道什么是管道?匿名管道🧨尝试使用:🍗处理细节问题: 🚀管道的4种情况和5种特征:4种情况&…

家庭用超声波清洗机好用吗?推荐四款性能绝佳的超声波清洗机!

在现代社会快节奏的日常中,高效清洁辅助工具成为了众多家庭的追求热点。超声波清洗机,作为集高效与便捷于一体的新兴清洗神器,正逐渐成为大众宠儿。但面对琳琅满目的市场选择,不同的型号搭载多样化的功能设定及波动的价格区间&…

【ECMAScript 从入门到进阶教程】第四部分:项目实践(项目结构与管理,单元测试,最佳实践与开发规范,附录)

第四部分:项目实践 第十四章 项目结构与管理 在构建现代 Web 应用程序时,良好的项目结构和管理是确保代码可维护性、高效开发和部署成功的关键因素。这一章将深入讨论项目初始化与配置,以及如何使用构建工具来简化和优化项目建设过程。 14…

前缀和算法详解

对于查询区间和的问题,可以预处理出来一个前缀和数组 dp,数组中存储的是从下标 0 的位置到当前位置的区间和,这样只需要通过前缀和数组就可以快速的求出指定区间的和了,例如求 l ~ r 区间的和,就可以之间使用 dp[l - 1…

【深度学习】交叉熵

交叉熵(Cross-Entropy)是信息论中的一个重要概念,也是在机器学习和深度学习中用于分类任务的常见损失函数。它衡量的是两个概率分布之间的差异,特别是模型的预测概率分布与真实分布的差异。 交叉熵最初是从信息论引入的&#xff0…

Python小示例——质地不均匀的硬币概率统计

在概率论和统计学中,随机事件的行为可以通过大量实验来研究。在日常生活中,我们经常用硬币进行抽样,比如抛硬币来决定某个结果。然而,当我们处理的是“质地不均匀”的硬币时,事情就变得复杂了。质地不均匀的硬币意味着…