本人小白,多多见谅
设备esps3-cam内置了一个ov2640的摄像头
运行代码
import camera
import time
def deinit_camera():
try:
camera.deinit()
print("摄像头资源已释放")
except Exception as e:
print("释放摄像头资源失败:", e)
def init_camera():
try:
deinit_camera()
time.sleep(1)
camera.init(0, format=camera.JPEG)
print("摄像头初始化成功")
except Exception as e:
print("摄像头初始化失败:", e)
raise
def main():
try:
init_camera()
except Exception as e:
print("程序运行失败:", e)
finally:
deinit_camera()
if __name__ == "__main__":
main()
运行输出
MPY: soft reboot
摄像头资源已释放
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x4201c02a PS : 0x00060030 A0 : 0x820134fe A1 : 0x3fced690
A2 : 0x3fcabe88 A3 : 0x3fced7f8 A4 : 0x3c132c8c A5 : 0x00001000
A6 : 0xffff8fff A7 : 0x3ffffffc A8 : 0x00000000 A9 : 0x3fced6a0
A10 : 0x00000016 A11 : 0x00000000 A12 : 0x0000005c A13 : 0x3fcabee4
A14 : 0x00000001 A15 : 0x00000005 SAR : 0x00000011 EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000000 LBEG : 0x400570e8 LEND : 0x400570f3 LCOUNT : 0x00000000
Backtrace: 0x4201c027:0x3fced690 0x420134fb:0x3fced6d0 0x42012fd9:0x3fced700 0x42002ba5:0x3fced750 0x42002c03:0x3fced7f0 0x4202018d:0x3fced8a0 0x42026e99:0x3fced8d0 0x42026f5d:0x3fced8f0 0x40379785:0x3fced910 0x4202012c:0x3fced9b0 0x42026e99:0x3fced9e0 0x403796d5:0x3fceda00 0x4202012c:0x3fcedaa0 0x42026e99:0x3fcedad0 0x403796d5:0x3fcedaf0 0x4202012c:0x3fcedb90 0x42026e99:0x3fcedbe0 0x42026eae:0x3fcedc00 0x42059133:0x3fcedc20 0x420592d0:0x3fcedcb0 0x42039f8a:0x3fcedd00
ELF file SHA256: cb0d8b0075e23314
Rebooting...
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0xc (RTC_SW_CPU_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)
Saved PC:0x40383786
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3810,len:0xf8c
load:0x403c9700,len:0xb3c
load:0x403cc700,len:0x2dc8
entry 0x403c989c
MicroPython v1.20.0-555-g92717a95c-dirty on 2023-11-05; ESP32S3 module (spiram octal) with ESP32S3
Type "help()" for more information.
7 个赞
DFxiner
(黄老邪)
4
坛子里有几位大佬的搞这个的,想不起来名字了,想起来再艾特。
今天开放注册了帖子多,你这不一定被大佬瞅见呀。
你需要看一下你的硬件原理图,按照原理图做一下管脚配置。
我这边的配置是
PWDN_GPIO_NUM = -1
RESET_GPIO_NUM = -1
XCLK_GPIO_NUM = 15
SIOD_GPIO_NUM = 4
SIOC_GPIO_NUM = 5
Y2_GPIO_NUM = 11
Y3_GPIO_NUM = 9
Y4_GPIO_NUM = 8
Y5_GPIO_NUM = 10
Y6_GPIO_NUM = 12
Y7_GPIO_NUM = 18
Y8_GPIO_NUM = 17
Y9_GPIO_NUM = 16
然后camera的初始化用如下方法:
camera.init(0, d0=Y2_GPIO_NUM, d1=Y3_GPIO_NUM, d2=Y4_GPIO_NUM, d3=Y5_GPIO_NUM, d4=Y6_GPIO_NUM, d5=Y7_GPIO_NUM, d6=Y8_GPIO_NUM, d7=Y9_GPIO_NUM,
format=camera.JPEG, framesize=camera.FRAME_HVGA,
xclk_freq=camera.XCLK_10MHz,
href=HREF_GPIO_NUM, vsync=VSYNC_GPIO_NUM, reset=RESET_GPIO_NUM, pwdn=PWDN_GPIO_NUM,
sioc=SIOC_GPIO_NUM, siod=SIOD_GPIO_NUM, xclk=XCLK_GPIO_NUM, pclk=PCLK_GPIO_NUM)
PS:淘宝卖的板子都是天下文章一大抄,售后也不好,哪天我闲了自己设计一块儿,省的这些事儿
xifan
(稀饭)
9
我有arduino版的代码
/**
* @file Camera.h
* @author 稀饭
* @brief 定义了 Camera 类,用于控制摄像头模块的初始化和图像捕获。
*
*/
#ifndef CAMERA_H
#define CAMERA_H
#include <Arduino.h>
#include <esp_camera.h>
#include "Logger.h"
extern Logger logger; ///< 外部定义的日志记录器对象
#define PWDN_GPIO_NUM 32 ///< 摄像头模块的电源控制 GPIO 引脚
#define RESET_GPIO_NUM -1 ///< 摄像头模块的复位 GPIO 引脚
#define XCLK_GPIO_NUM 0 ///< 摄像头模块的时钟信号 GPIO 引脚
#define SIOD_GPIO_NUM 26 ///< 摄像头模块的数据线 GPIO 引脚
#define SIOC_GPIO_NUM 27 ///< 摄像头模块的控制线 GPIO 引脚
#define Y9_GPIO_NUM 35 ///< 摄像头模块的 Y9 数据线 GPIO 引脚
#define Y8_GPIO_NUM 34 ///< 摄像头模块的 Y8 数据线 GPIO 引脚
#define Y7_GPIO_NUM 39 ///< 摄像头模块的 Y7 数据线 GPIO 引脚
#define Y6_GPIO_NUM 36 ///< 摄像头模块的 Y6 数据线 GPIO 引脚
#define Y5_GPIO_NUM 21 ///< 摄像头模块的 Y5 数据线 GPIO 引脚
#define Y4_GPIO_NUM 19 ///< 摄像头模块的 Y4 数据线 GPIO 引脚
#define Y3_GPIO_NUM 18 ///< 摄像头模块的 Y3 数据线 GPIO 引脚
#define Y2_GPIO_NUM 5 ///< 摄像头模块的 Y2 数据线 GPIO 引脚
#define VSYNC_GPIO_NUM 25 ///< 摄像头模块的 VSYNC 信号 GPIO 引脚
#define HREF_GPIO_NUM 23 ///< 摄像头模块的 HREF 信号 GPIO 引脚
#define PCLK_GPIO_NUM 22 ///< 摄像头模块的像素时钟 GPIO 引脚
/**
* ### 摄像头控制类
*
* 该类负责控制摄像头模块的初始化和图像捕获。
*
* ### 属性
*
* - `config`:摄像头配置信息
*
* ### 方法
*
* - `Camera()`:构造函数
* - `init()`:初始化摄像头模块
* - `capture()`:捕获图像
*
*/
class Camera {
public:
/**
* ### 构造函数
*
* 初始化 Camera 对象。
*/
Camera();
/**
* ### 初始化摄像头模块
*
* 初始化 ESP32 上的摄像头模块。
*
* #### 返回
*
* - esp_err_t:ESP32 系统错误码,ESP_OK 表示成功
*/
esp_err_t init();
/**
* ### 捕获图像
*
* 从摄像头模块捕获图像帧。
*
* #### 返回
*
* - camera_fb_t*:指向捕获到的图像帧的指针
*/
camera_fb_t* capture();
/**
* ### 返回图像帧缓冲区
*
* 释放不再使用的图像帧缓冲区。
*
* #### 参数
*
* - `fb`:要释放的图像帧缓冲区的指针
*/
void returnFrameBuffer(camera_fb_t *fb);
private:
camera_config_t config; ///< 摄像头配置信息
};
#endif // CAMERA_H
/**
* @file Camera.cpp
* @author 稀饭
* @brief 实现了 Camera 类的方法,包括摄像头模块的初始化和图像捕获功能。
*/
#include "Camera.h"
/**
* ### 构造函数
*
* 初始化 Camera 对象,并设置摄像头模块的配置参数。
*/
Camera::Camera()
{
config = (camera_config_t){
.pin_pwdn = PWDN_GPIO_NUM,
.pin_reset = RESET_GPIO_NUM,
.pin_xclk = XCLK_GPIO_NUM,
.pin_sscb_sda = SIOD_GPIO_NUM,
.pin_sscb_scl = SIOC_GPIO_NUM,
.pin_d7 = Y9_GPIO_NUM,
.pin_d6 = Y8_GPIO_NUM,
.pin_d5 = Y7_GPIO_NUM,
.pin_d4 = Y6_GPIO_NUM,
.pin_d3 = Y5_GPIO_NUM,
.pin_d2 = Y4_GPIO_NUM,
.pin_d1 = Y3_GPIO_NUM,
.pin_d0 = Y2_GPIO_NUM,
.pin_vsync = VSYNC_GPIO_NUM,
.pin_href = HREF_GPIO_NUM,
.pin_pclk = PCLK_GPIO_NUM,
.xclk_freq_hz = 20000000,
.ledc_timer = LEDC_TIMER_0,
.ledc_channel = LEDC_CHANNEL_0,
.pixel_format = PIXFORMAT_JPEG,
.frame_size = FRAMESIZE_QVGA,
.jpeg_quality = 10,
.fb_count = 1,
};
}
/**
* ### 初始化摄像头模块
*
* 初始化 ESP32 上的摄像头模块,并配置指定的参数。
*
* #### 返回
*
* - esp_err_t:ESP32 系统错误码,ESP_OK 表示成功
*/
esp_err_t Camera::init()
{
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK)
{
logger.error("相机初始化失败", "camera");
return err;
}
sensor_t *s = esp_camera_sensor_get();
if (s->id.PID == OV2640_PID)
{
// Camera initialized
}
logger.info("相机初始化成功", "camera");
return ESP_OK;
}
/**
* ### 捕获图像
*
* 从摄像头模块捕获一帧图像。
*
* #### 返回
*
* - camera_fb_t*:指向捕获到的图像帧的指针,如果捕获失败,则返回 nullptr
*/
camera_fb_t *Camera::capture()
{
camera_fb_t *fb = esp_camera_fb_get();
if (!fb)
{
logger.error("获取图像失败", "camera");
return nullptr;
}
logger.info("获取图像成功", "camera");
return fb;
}
/**
* ### 返回图像帧缓冲区
*
* 释放不再使用的图像帧缓冲区。
*
* #### 参数
*
* - `fb`:要释放的图像帧缓冲区的指针
*/
void Camera::returnFrameBuffer(camera_fb_t *fb)
{
esp_camera_fb_return(fb);
}
system
(system)
关闭
10
此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。