[ESP-IDF]:esp32-camera 使用指南 ESP32S3-OV2640 用例测试
【核知坊】:释放青春想象,码动全新视野。
我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!!
内容摘要:esp32-camera 组件为 ESP32 系列 SoC 提供了兼容的图像传感器驱动,同时提供了工具,将捕获的帧数据转换为常见的 BMP 和 JPEG 格式。该组件的设计适用于各种不同的图像传感器,并支持高质量的图像采集与处理。本文使用 VSCode + ESP-IDF v5.4 环境对 esp32-camera 进行部署。
关键词:esp32-camera VScode ESP-IDF OV2640
其他相关文章:
⛏。。。。
1.组件获取
Gitee 平台组件链接:esp32-camera: esp32 camera
下载压缩包或者拉取整个项目:
git clone https://gitee.com/esp-components/esp32-camera
使用ESP-IDF官方例程:esp-idf: ESP-IDF 是由乐鑫官方推出的针对 ESP32 和 ESP32-S2 系列芯片的开发框架。ESP-IDF 国内镜像仓库,Issues 和 PRs 请仍旧提交到 github。重要:Gitee 中 ESP-IDF 仓库的使用,请先参看 https://gitee.com/EspressifSystems/esp-gitee-tools 中的说明文档。ESP-IDF 及其子模块,每日会自动同步若干次。 - Gitee.com
esp-idf: ESP-IDF 是由乐鑫官方推出的针对 ESP32 和 ESP32-S2 系列芯片的开发框架。ESP-IDF 国内镜像仓库,Issues 和 PRs 请仍旧提交到 github。重要:Gitee 中 ESP-IDF 仓库的使用,请先参看 https://gitee.com/EspressifSystems/esp-gitee-tools 中的说明文档。ESP-IDF 及其子模块,每日会自动同步若干次。 - Gitee.com
下载后将项目结构配置如下:
├─.vscode|CMakeLists.txt|sdkconfig├─main│ CMakeLists.txt│ hello_world_main.c└─my_components└─esp32-camera├─.github│ └─workflows├─conversions│ ├─include│ └─private_include├─driver│ ├─include│ └─private_include├─examples│ └─camera_example│ └─main├─sensors│ └─private_include├─target│ ├─esp32│ ├─esp32s2│ │ └─private_include│ ├─esp32s3│ ├─jpeg_include│ └─private_include└─test└─pictures
esp32-camera 支持的 SoC
该组件支持以下 ESP32 系列的 SoC:
-
ESP32
-
ESP32-S2
-
ESP32-S3
这些 SoC 在图像采集和处理的性能上有所不同,但该驱动程序的设计考虑到了不同设备的适配性。
esp32-camera 支持的图像传感器
该驱动支持多种图像传感器,涵盖了从低分辨率到高分辨率的广泛范围,适用于各种不同的应用场景。以下是部分支持的传感器及其特点:
传感器型号 | 最大分辨率 | 色彩类型 | 输出格式 | 镜头大小 |
---|---|---|---|---|
OV2640 | 1600 x 1200 | 彩色 | YUV(422/420)/YCbCr422,RGB565/555,8位压缩数据,8/10位Raw RGB数据 | 1/4" |
OV3660 | 2048 x 1536 | 彩色 | Raw RGB数据,RGB565/555/444,CCIR656,YCbCr422,压缩 | 1/5" |
OV5640 | 2592 x 1944 | 彩色 | RAW RGB,RGB565/555/444,CCIR656,YUV422/420,YCbCr422,压缩 | 1/4" |
OV7670 | 640 x 480 | 彩色 | Raw Bayer RGB,处理后的Bayer RGB,YUV/YCbCr422,GRB422,RGB565/555 | 1/6" |
OV7725 | 640 x 480 | 彩色 | Raw RGB,GRB 422,RGB565/555/444,YCbCr 422 | 1/4" |
NT99141 | 1280 x 720 | 彩色 | YCbCr 422,RGB565/555/444,Raw,CCIR656,JPEG压缩 | 1/4" |
GC032A | 640 x 480 | 彩色 | YUV/YCbCr422,RAW Bayer,RGB565 | 1/10" |
GC0308 | 640 x 480 | 彩色 | YUV/YCbCr422,RAW Bayer,RGB565,灰度图像 | 1/6.5" |
GC2145 | 1600 x 1200 | 彩色 | YUV/YCbCr422,RAW Bayer,RGB565 | 1/5" |
BF3005 | 640 x 480 | 彩色 | YUV/YCbCr422,RAW Bayer,RGB565 | 1/4" |
BF20A6 | 640 x 480 | 彩色 | YUV/YCbCr422,RAW Bayer,只有Y通道 | 1/10" |
SC101IOT | 1280 x 720 | 彩色 | YUV/YCbCr422,Raw RGB | 1/4.2" |
SC030IOT | 640 x 480 | 彩色 | YUV/YCbCr422,RAW Bayer | 1/6.5" |
SC031GS | 640 x 480 | 单色 | RAW MONO,灰度图像 | 1/6" |
esp32-camera 关键特点与要求
-
PSRAM要求:
除了使用CIF或更低分辨率的JPEG时,驱动需要安装并激活PSRAM(外部静态随机存储器)。使用YUV或RGB时,由于写入PSRAM的速度较慢,可能会导致图像数据丢失,特别是在启用WiFi时。若需要RGB数据,建议先捕获JPEG格式的图像,再使用fmt2rgb888
或fmt2bmp
/frame2bmp
进行转换。 -
帧缓冲区模式:
单帧缓冲区模式:驱动等待当前帧完成(VSYNC),然后启动I2S DMA进行数据传输。这种方式可以更好地控制系统,但获取帧的时间较长。双帧缓冲区模式及以上:I2S处于连续模式,每一帧都会被推送到队列中,应用程序可以更快地访问帧数据。这种方式会增加CPU和内存负担,但能提高帧率,建议仅在使用JPEG格式时启用。 -
性能优化:
对于ESP32-S系列芯片,推荐将外部时钟频率设置为16MHz,以启用EDMA模式,提高图像数据处理性能。
2. 硬件参数配置
请在修改前先进行一次编译,确保例程能够正确编译。编译通过后桌面底部打开 ESP-IDF 终端 进行硬件参数配置:
执行以下命令打开配置UI:
idf.py menuconfig
快捷键(英文键盘):
-
H 或 ESC 返回上一级
-
J 下一个
-
K 上一个
-
L 或 Enter 进入选项
-
Q 保存退出(Y/N)
-
Space 开启(星号*)/关闭 (无)
2.1 配置SPRAM(外部静态随机存储器)
选择Component config 选项回车进入:
根据要求配置Serial Flasher config(可选):
返回往下找到 ESP-PSRAM 选项回车进入:
空格开启第一项:
进入SPI RAM config 选项:
根据你的开发板选择合适的SPI 模式(QUAD/OCT),本文使用ESP32-S3 使用的OCT:
保存退出, 输入Y确认:
3.配置CmakeList.txt
根目录下的 CmakeList.txt 添加自定义的组件文件夹(建议把my_components放到ESP-IDF安装路径下,这样其他项目使用时直接引用,无需再复制):
# The following lines of boilerplate have to be in your project's# CMakeLists in this exact order for cmake to work correctlycmake_minimum_required(VERSION 3.16)set(EXTRA_COMPONENT_DIRS ${CMAKE_CURRENT_LIST_DIR}/my_components)include($ENV{IDF_PATH}/tools/cmake/project.cmake)project(hello_world)
main文件夹下的 CmakeList.txt 主要配置 .c .h文件路径,引入esp32-camera依赖库:
idf_component_register(SRCS "hello_world_main.c"INCLUDE_DIRS "../my_components/esp32-camera/driver/include" "${IDF_PATH}/components/esp_driver_ledc/include""${IDF_PATH}/components/esp_driver_spi/include" "${IDF_PATH}/components/esp_driver_gpio/include" "${IDF_PATH}/components/esp_timer/include" "${IDF_PATH}/components/log/include" PRIV_REQUIRES spi_flash )
4.摄像头参数初始化
由于我使用的ESP32-S3-CAM (GOOUU版),摄像头引脚如下:
#define PWDN_GPIO_NUM -1#define RESET_GPIO_NUM -1#define XCLK_GPIO_NUM 15#define SIOD_GPIO_NUM 4#define SIOC_GPIO_NUM 5#define Y2_GPIO_NUM 11#define Y3_GPIO_NUM 9#define Y4_GPIO_NUM 8#define Y5_GPIO_NUM 10#define Y6_GPIO_NUM 12#define Y7_GPIO_NUM 18#define Y8_GPIO_NUM 17#define Y9_GPIO_NUM 16#define VSYNC_GPIO_NUM 6#define HREF_GPIO_NUM 7#define PCLK_GPIO_NUM 13
配置结构体:
static camera_config_t camera_config;camera_config.ledc_channel = LEDC_CHANNEL_0;camera_config.ledc_timer = LEDC_TIMER_0;camera_config.pin_d0 = Y2_GPIO_NUM;camera_config.pin_d1 = Y3_GPIO_NUM;camera_config.pin_d2 = Y4_GPIO_NUM;camera_config.pin_d3 = Y5_GPIO_NUM;camera_config.pin_d4 = Y6_GPIO_NUM;camera_config.pin_d5 = Y7_GPIO_NUM;camera_config.pin_d6 = Y8_GPIO_NUM;camera_config.pin_d7 = Y9_GPIO_NUM;camera_config.pin_xclk = XCLK_GPIO_NUM;camera_config.pin_pclk = PCLK_GPIO_NUM;camera_config.pin_vsync = VSYNC_GPIO_NUM;camera_config.pin_href = HREF_GPIO_NUM;camera_config.pin_sccb_sda = SIOD_GPIO_NUM;camera_config.pin_sccb_scl = SIOC_GPIO_NUM;camera_config.pin_pwdn = PWDN_GPIO_NUM;camera_config.pin_reset = RESET_GPIO_NUM;camera_config.xclk_freq_hz = 10000000;camera_config.pixel_format = PIXFORMAT_JPEG;camera_config.frame_size = FRAMESIZE_VGA;camera_config.jpeg_quality = 10;camera_config.fb_count = 2;
初始化摄像头:
// initialize the cameraesp_err_t err = esp_camera_init(&camera_config);if (err != ESP_OK){ESP_LOGE(TAG, "Camera Init Failed");return;}vTaskDelay(pdMS_TO_TICKS(20));
创建数据帧,并使用esp_camera_fb_get获取, esp_camera_fb_return(fb),它的作用是 将已经获取并使用完的帧缓冲(frame buffer)归还给驱动程序进行复用,以节省内存和保证后续图像采集的正常进行。(注意:请不要在初始化后立即使用功能函数,请将功能函数放到while中或者任务中)
camera_fb_t *fb = NULL;while (1){printf("Hello world!\n");vTaskDelay(pdMS_TO_TICKS(500));fb = esp_camera_fb_get();if (!fb){ESP_LOGE(TAG, "Camera capture failed");continue;}esp_camera_fb_return(fb);ESP_LOGI(TAG, "fb->width=%d, fb->height=%d,fb->buf=%d, fb->len=%d",fb->width, fb->height,fb->buf[0], fb->len);}
文章总结:
本文讲解了esp32-camera 的基础使用方法,并在 ESP32S3 开发板上使用 OV2640 进行了实际测试。
感谢阅览,如果你喜欢该内容的话,可以点赞,收藏,转发。由于 Koro 能力有限,有任何问题请在评论区内提出,Koro 看到后第一时间回复您!!!
其他精彩内容:
参考内容:
附录
//main.c
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_camera.h"
#include "esp_log.h"static const char *TAG = "MAIN";#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 15
#define SIOD_GPIO_NUM 4
#define SIOC_GPIO_NUM 5#define Y2_GPIO_NUM 11
#define Y3_GPIO_NUM 9
#define Y4_GPIO_NUM 8
#define Y5_GPIO_NUM 10
#define Y6_GPIO_NUM 12
#define Y7_GPIO_NUM 18
#define Y8_GPIO_NUM 17
#define Y9_GPIO_NUM 16#define VSYNC_GPIO_NUM 6
#define HREF_GPIO_NUM 7
#define PCLK_GPIO_NUM 13void app_main(void)
{// Device : ESP32-S3 OV2640 开启 SPIRAM OctalSPI 模式 // idf.py menuconfig static camera_config_t camera_config;camera_config.ledc_channel = LEDC_CHANNEL_0;camera_config.ledc_timer = LEDC_TIMER_0;camera_config.pin_d0 = Y2_GPIO_NUM;camera_config.pin_d1 = Y3_GPIO_NUM;camera_config.pin_d2 = Y4_GPIO_NUM;camera_config.pin_d3 = Y5_GPIO_NUM;camera_config.pin_d4 = Y6_GPIO_NUM;camera_config.pin_d5 = Y7_GPIO_NUM;camera_config.pin_d6 = Y8_GPIO_NUM;camera_config.pin_d7 = Y9_GPIO_NUM;camera_config.pin_xclk = XCLK_GPIO_NUM;camera_config.pin_pclk = PCLK_GPIO_NUM;camera_config.pin_vsync = VSYNC_GPIO_NUM;camera_config.pin_href = HREF_GPIO_NUM;camera_config.pin_sccb_sda = SIOD_GPIO_NUM;camera_config.pin_sccb_scl = SIOC_GPIO_NUM;camera_config.pin_pwdn = PWDN_GPIO_NUM;camera_config.pin_reset = RESET_GPIO_NUM;camera_config.xclk_freq_hz = 10000000;camera_config.pixel_format = PIXFORMAT_JPEG;camera_config.frame_size = FRAMESIZE_VGA;camera_config.jpeg_quality = 10;camera_config.fb_count = 2;// initialize the cameraesp_err_t err = esp_camera_init(&camera_config);if (err != ESP_OK){ESP_LOGE(TAG, "Camera Init Failed");return;}vTaskDelay(pdMS_TO_TICKS(20));camera_fb_t *fb = NULL;while (1){printf("Hello world!\n");vTaskDelay(pdMS_TO_TICKS(500));fb = esp_camera_fb_get();if (!fb){ESP_LOGE(TAG, "Camera capture failed");continue;}esp_camera_fb_return(fb);ESP_LOGI(TAG, "fb->width=%d, fb->height=%d, fb->buf=%d, fb->len=%d", fb->width, fb->height, fb->buf[0], fb->len);}
}// PS D:\BLOG_PROBLEM\hello_world> & 'd:\Espressif\tools\python_env\idf5.4_py3.11_env\Scripts\python.exe' 'd:\Espressif\frameworks\esp-idf-v5.4\tools\idf_monitor.py' -p COM4 -b 115200 --toolchain-prefix xtensa-esp32s3-elf- --target esp32s3 'd:\BLOG_PROBLEM\hello_world\build\hello_world.elf'
// OG_PROBLEM\x5chello_world\x5cbuild\x5chello_world.elf';778f9491-c7c8-430c-9138-43b4a91929c2--- Warning: GDB cannot open serial ports accessed as COMx
// --- Using \\.\COM4 instead...
// --- esp-idf-monitor 1.5.0 on \\.\COM4 115200
// --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
// ESP-ROM:esp32s3-20210327
// Build:Mar 27 2021
// rst:0x1 (POWERON),boot:0xa (SPI_FAST_FLASH_BOOT)
// SPIWP:0xee
// mode:DIO, clock div:1
// load:0x3fce2810,len:0x15a0
// load:0x403c8700,len:0x4
// load:0x403c8704,len:0xd20
// load:0x403cb700,len:0x2ee4
// entry 0x403c8928
// I (27) boot: ESP-IDF v5.4-dirty 2nd stage bootloader
// I (27) boot: compile time Apr 24 2025 23:05:09
// I (27) boot: Multicore bootloader
// I (27) boot: chip revision: v0.2
// I (30) boot: efuse block revision: v1.3
// I (34) boot.esp32s3: Boot SPI Speed : 80MHz
// I (38) boot.esp32s3: SPI Mode : DIO
// I (41) boot.esp32s3: SPI Flash Size : 16MB
// I (45) boot: Enabling RNG early entropy source...
// I (50) boot: Partition Table:
// I (52) boot: ## Label Usage Type ST Offset Length
// I (59) boot: 0 nvs WiFi data 01 02 00009000 00006000
// I (65) boot: 1 phy_init RF data 01 01 0000f000 00001000
// I (72) boot: 2 factory factory app 00 00 00010000 00100000
// I (78) boot: End of partition table
// I (81) esp_image: segment 0: paddr=00010020 vaddr=3c030020 size=0eae8h ( 60136) map
// I (100) esp_image: segment 1: paddr=0001eb10 vaddr=3fc93600 size=01508h ( 5384) load
// I (101) esp_image: segment 2: paddr=00020020 vaddr=42000020 size=27c9ch (162972) map
// I (133) esp_image: segment 3: paddr=00047cc4 vaddr=3fc94b08 size=02928h ( 10536) load
// I (135) esp_image: segment 4: paddr=0004a5f4 vaddr=40374000 size=0f534h ( 62772) load
// I (150) esp_image: segment 5: paddr=00059b30 vaddr=600fe100 size=0001ch ( 28) load
// I (157) boot: Loaded app from partition at offset 0x10000
// I (157) boot: Disabling RNG early entropy source...
// I (168) octal_psram: vendor id : 0x0d (AP)
// I (168) octal_psram: dev id : 0x02 (generation 3)
// I (168) octal_psram: density : 0x03 (64 Mbit)
// I (170) octal_psram: good-die : 0x01 (Pass)
// I (174) octal_psram: Latency : 0x01 (Fixed)
// I (179) octal_psram: VCC : 0x01 (3V)
// I (183) octal_psram: SRF : 0x01 (Fast Refresh)
// I (188) octal_psram: BurstType : 0x01 (Hybrid Wrap)
// I (193) octal_psram: BurstLen : 0x01 (32 Byte)
// I (197) octal_psram: Readlatency : 0x02 (10 cycles@Fixed)
// I (202) octal_psram: DriveStrength: 0x00 (1/1)
// I (207) esp_psram: Found 8MB PSRAM device
// I (210) esp_psram: Speed: 40MHz
// I (213) cpu_start: Multicore app
// I (947) esp_psram: SPI SRAM memory test OK
// I (956) cpu_start: Pro cpu start user code
// I (956) cpu_start: cpu freq: 160000000 Hz
// I (956) app_init: Application information:
// I (956) app_init: Project name: hello_world
// I (960) app_init: App version: 1
// I (964) app_init: Compile time: Apr 24 2025 23:31:56
// I (969) app_init: ELF file SHA256: 61f6f5fe3...
// I (973) app_init: ESP-IDF: v5.4-dirty
// I (977) efuse_init: Min chip rev: v0.0
// I (981) efuse_init: Max chip rev: v0.99
// I (985) efuse_init: Chip rev: v0.2
// I (989) heap_init: Initializing. RAM available for dynamic allocation:
// I (995) heap_init: At 3FC985C0 len 00051150 (324 KiB): RAM
// I (1000) heap_init: At 3FCE9710 len 00005724 (21 KiB): RAM
// I (1006) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM
// I (1011) heap_init: At 600FE11C len 00001ECC (7 KiB): RTCRAM
// I (1016) esp_psram: Adding pool of 8192K of PSRAM memory to heap allocator
// I (1024) spi_flash: detected chip: boya
// I (1026) spi_flash: flash io: dio
// I (1030) sleep_gpio: Configure to isolate all GPIO pins in sleep state
// I (1036) sleep_gpio: Enable automatic switching of GPIO sleep configuration
// I (1043) main_task: Started on CPU0
// I (1073) esp_psram: Reserving pool of 32K of internal memory for DMA/internal allocations
// I (1073) main_task: Calling app_main()
// I (1073) s3 ll_cam: DMA Channel=0
// I (1073) cam_hal: cam init ok
// I (1083) sccb-ng: pin_sda 4 pin_scl 5
// I (1083) sccb-ng: sccb_i2c_port=1
// I (1093) camera: Detected camera at address=0x30
// I (1093) camera: Detected OV2640 camera
// I (1093) camera: Camera PID=0x26 VER=0x42 MIDL=0x7f MIDH=0xa2
// I (1173) cam_hal: buffer_size: 16384, half_buffer_size: 1024, node_buffer_size: 1024, node_cnt: 16, total_cnt: 60
// I (1173) cam_hal: Allocating 61440 Byte frame buffer in PSRAM
// I (1183) cam_hal: Allocating 61440 Byte frame buffer in PSRAM
// I (1183) cam_hal: cam config ok
// I (1183) ov2640: Set PLL: clk_2x: 0, clk_div: 0, pclk_auto: 0, pclk_div: 8
// Hello world!
// I (1773) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=14231
// Hello world!
// I (2273) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=29794
// Hello world!
// I (2773) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=30281
// Hello world!
// I (3273) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=29282
// Hello world!
// I (3773) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=28217
// Hello world!
// I (4273) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=27177
// Hello world!
// I (4773) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=26266
// Hello world!
// I (5273) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=25270
// Hello world!
// I (5773) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=24113
// Hello world!
// I (6273) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=23053
// Hello world!
// I (6773) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=22014
// Hello world!
// I (7273) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=20770
// Hello world!
// I (7773) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=20222
// Hello world!
// I (8273) MAIN: fb->width=640, fb->height=480, fb->buf=255, fb->len=19994
// Hello world!
// --- Error: GetOverlappedResult failed (PermissionError(13, '鎷掔粷璁块棶銆?', None, 5))
// --- Waiting for the device to reconnect....................................
相关文章:
[ESP-IDF]:esp32-camera 使用指南 ESP32S3-OV2640 用例测试
【核知坊】:释放青春想象,码动全新视野。 我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!! 内容摘要:esp32-camera 组件为 ESP32 系列 SoC 提供了兼容的图…...
在统信UOS/麒麟Kylin OS中创建网页桌面快捷方式
在统信UOS/麒麟Kylin OS中创建网页桌面快捷方式 本文将详细介绍如何在统信UOS或麒麟KYLINOS中使用命令行创建一个网页桌面快捷方式,以方便构建云桌面模板及镜像模板。欢迎大家浏览、分享和转发!请关注我以获取更多技术分享。 1. 查看系统信息 首先&am…...
SQLite 是什么?
📌 一、SQLite 是什么? SQLite 是一个轻量级、嵌入式数据库,意思是它直接集成在你的 App 内部,不需要单独安装数据库服务端。 ✅ 特点: 特点说明本地使用所有数据保存在手机内部存储文件形式数据以 .db 文件形式存储…...
恒创科技「香港大带宽云」新老用户专享实例及热门配置
全球化数字浪潮下,高带宽应用正深度重构各行业运营模式——从跨境电商、流媒体与视频点播,到在线游戏与云游戏加速,涵盖所有高并发、强交互的业务场景。在此背景下,企业对高性能 IT 基础架构的需求持续升级,以此来支持…...
fpga系列 HDL:verilog latch在fpga中的作用 避免latch的常见做法
目录 Latch在FPGA中的作用Quartus中有关latch的警告⚠避免Latch的常见做法1. if-else 语句未覆盖所有条件生成Latch的代码:修复后的代码: 2. case语句未覆盖所有分支生成Latch的代码:修复后的代码: 3. 组合逻辑中缺少默认赋值生成…...
java配置
环境变量...
解决虚拟主机ping不通本地主机问题
win11 1 问题 虚拟主机和本地主机在同一网段。 2 解决方案 以win11为例: 设置 -> 网络和 Internet -> 高级网路设置 -> Windows 防火墙 -> 高级设置 -> 入站规则 -> 新建规则 需要设置:规则类型、 协议和端口、名称,其…...
Move Registry 发布,实现 Sui 的超级互操作性
Move Registry(MVR)的到来对 Sui 来说是一件大事。MVR 是一个功能齐全的链上包管理系统,提升了整个生态的可发现性、可信度和互操作性。Sui 本身就是最具互操作性的链之一,凭借 Move 语言和可编程交易区块(PTBs&#x…...
【Linux】gdb工具,Linux 下程序调试的 “透视眼”
目录 调试代码调试注意事项gdb和Cgdb调试命令汇总行号显示断点设置查看断点信息删除断点开启 / 禁用断点运行 / 调试逐过程和逐语句打印 / 追踪变量指定行号跳转强制执行函数 补充命令watchset var 替换变量值条件断点 end 调试代码 这是本次调试要用的代码 1 #include <st…...
脚本分享:快速作图对比wannier拟合能带python脚本
本脚本通过Python实现电子能带结构数据的快速作图,能够从两个不同的数据文件(BAND.dat 和 wannier90_band.dat)中提取有效数据,并在同一坐标系下绘制对比图。 准备工作:使用VASPKIT处理获得能带数据BAND.datÿ…...
解决ssh拉取服务器数据,要多次输入密码的问题
问题在于,每次循环调用 rsync 都是新开一个连接,所以每次都需要输入一次密码。为了只输入一次密码,有以下几种方式可以解决: ✅ 推荐方案:设置 SSH 免密登录 最稳最安全的方式是:配置 SSH 免密登录&#x…...
金仓数据库 KingbaseES 产品深度优化提案:迈向卓越的全面升级
文章目录 一、引言二、性能优化(一)查询性能提升1. 优化查询优化器引入基于代价的查询优化算法支持更多的查询优化提示 2. 索引优化支持更多类型的索引优化索引的创建和维护策略 (二)并发处理能力增强1. 锁机制优化采用更细粒度的…...
企业级智能合同管理解决方案升级报告:道本科技携手DeepSeek打造智能合同管理新标杆
当传统合同管理系统还在与堆积如山的纸质文档较劲时,道本科技与DeepSeek联合开发的智能合同平台已为国央企打开新视界。我们以某大型能源集团的实际应用为例,带您直观感受技术升级带来的管理变革。 一、技术升级的具象化呈现 在未接入DeepSeek技术前&a…...
C#并行编程极大提升集合处理速度,再也没人敢说你程序性能差了!
马工撰写的年入30万C#上位机项目实战必备教程(点击下方链接即可访问文章目录) 1、《C#串口通信从入门到精通》 2、《C#与PLC通信从入门到精通 》 3、《C# Modbus通信从入门到精通》 4、《C#Socket通信从入门到精通 》 5、《C# MES通信从入门到精通》 6、…...
[贪心_7] 最优除法 | 跳跃游戏 II | 加油站
目录 1.最优除法 题解 2.跳跃游戏 II 题解 3.加油站 题解 利用 单调性,可以实现 区间跳跃 1.最优除法 链接: 553. 最优除法 给定一正整数数组 nums,nums 中的相邻整数将进行浮点除法。 例如,nums [2,3,4],我…...
【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
【CUDA 编译 bug】ld: cannot find -lcudart
我们使用 Conda 安装 pytorch 和 CUDA 环境之后,要用 Conda 的CUDA环境进行某个库编译时,出现了bug: /mnt/data/home/xxxx/miniforge3/envs/GAGAvatar/compiler_compat/ld: cannot find -lcudart: No such file or directorycollect2: error…...
MYSQL之数据类型
数据类型分类 数值类型 在MySQL中, 整型可以指定是有符号的和无符号的, 默认是有符号的. 可以通过 UNSIGNED 来说明某个字段是无符号的. tinyint类型 以tinyint为例, 其它的整型类型都只是数据范围的区别. 数据越界 创建一个 tinyint 类型的 num 的属性, 大小为 1 字节, 不…...
Asp.Net Core 异常筛选器ExceptionFilter
文章目录 前言一、异常筛选器的核心概念用途:实现接口:执行时机: 二、使用步骤1.创建自定义异常筛选器2.注册异常筛选器全局注册(对所有 Controller 生效):局部注册(通过特性标记特定的 **Contr…...
WebUI可视化:第2章:技术基础准备
学习目标 ✅ 掌握HTML/CSS基础语法 ✅ 理解JavaScript核心功能 ✅ 了解前后端交互原理 2.1 HTML基础:网页的骨架 2.1.1 基础结构 每个HTML文件都必须包含以下基本结构: html <!DOCTYPE html> <html> <head><title>我的第一个网页</title> …...
Java基础集合 面试经典八股总结 [连载ing]
序言 八股,怎么说呢。我之前系统学习的内容,进行梳理。通过问题的方式,表达出得当的内容,这件事本身就很难。面试时心态、状态、掌握知识的情况等。关于八股文,我不想有太多死记硬背的内容,更多的是希望自我…...
大数据运维面试题
华为大数据运维面试题可能涵盖多个方面,以下是一些可能的面试问题及解析,这些问题旨在考察应聘者的技术知识、问题解决能力和对大数据运维的理解: 一、技术知识类问题 简述大数据运维的主要职责和工作内容 回答示例:大数据运维工…...
OpenBMC:BmcWeb login认证
BmcWeb在include\login_routes.hpp中实现了/login用于完成web的登录: BMCWEB_ROUTE(app, "/login").methods(boost::beast::http::verb::post)(handleLogin);inline void handleLogin(const crow::Request& req,const std::shared_ptr<bmcweb::AsyncResp>…...
Python学习之路(五)-接口API
在 Python 中结合数据库开发接口 API 通常使用 Web 框架(如 Flask 或 Django)和 ORM(对象关系映射)工具(如 SQLAlchemy 或 Django ORM)。以下是使用 Flask 和 SQLAlchemy 的详细步骤,展示如何结合数据库开发一个简单的 API。 使用 Flask 和 SQLAlchemy 开发 API 1. 安…...
数据库+Docker+SSH三合一!深度评测HexHub的全栈开发体验
作为一名技术博主,我最近一直被各种开发工具切换搞得焦头烂额。数据库要用Navicat,服务器管理得开Termius,Docker操作还得切到命令行,每天光在不同工具间切换就浪费了大量时间。直到团队里的一位架构师向我推荐了HexHub这个一体化…...
涂料油墨制造数字化转型的关键技术与挑战
涂料油墨制造行业正处于数字化转型的关键时期,这一转型是提升生产效率、增强产品质量和降低成本的重要途径。以下是该行业在数字化转型中的关键技术与面临的挑战: 关键技术: 工业互联网技术:通过在生产设备上安装传感器…...
UE5 调整字体、界面大小
文章目录 方案一 5.4 版本及以上(推荐)方案二 5.3 版本及以下(推荐)方案三 使用插件(不推荐) 方案一 5.4 版本及以上(推荐) 进入 编辑 > 编辑器偏好设置,如下图所示&…...
【OpenCV图像处理实战】从基础操作到工业级应用
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现(6个案例)案例1:图像基本操作案例2:边缘检测案例3&…...
生成随机验证码-解析与优化
文章目录 代码功能解析潜在问题与优化建议1. 安全性问题2. 易混淆字符过滤3. 参数校验4. 性能优化 扩展功能示例1. 自定义字符集2. 批量生成验证码 完整优化代码关键总结 代码功能解析 import random import stringdef generate_code(length6):chars string.digits string.a…...
VMware 虚拟机镜像资源网站
常见的 VMware 虚拟机镜像资源网站 网站名称链接地址特点OSBoxes.orgOSBoxes - Virtual Machines for VirtualBox & VMware 提供 .vmx .vmdk,适合 VMware 和 VirtualBox,更新频率高,界面清晰LinuxVMImages.comLinux VM Images - Downlo…...
HTML5 详细学习笔记
1. HTML5 简介 HTML5 是最新的 HTML 标准,于 2014 年 10 月由 W3C 完成标准制定。它增加了许多新特性,包括语义化标签、多媒体支持、图形效果、离线存储等。 1.1 HTML5 文档基本结构 <!DOCTYPE html> <html lang"zh-CN"> <h…...
真.从“零”搞 VSCode+STM32CubeMx+C <1>构建
目录 前言 准备工作 创建STM32CubeMx项目 VSCode导入项目&配置 构建错误调试 后记 前言 去年10月开始接触单片机,一直在用树莓派的Pico,之前一直用Micropython,玩的不亦乐乎,试错阶段优势明显,很快就能鼓捣一…...
Pikachu靶场
本质是信任了不可信的客户端输入。防御核心: 永不信任客户端提交的权限参数(如 user_id, role)。强制服务端校验用户身份与操作权限。定期审计权限模型,避免业务迭代引入新漏洞。 水平越权 1,按照网站的提示要求登录 进…...
五、web自动化测试01
目录 一、HTML基础1、HTML介绍2、常用标签3、基础案例3.1 前端代码3.2 自动化测试 二、CSS定位1、css介绍2、案例3、代码优化 三、表单自动化1、案例2、元素属性定位 四、后台基础数据自动化1、登录1.1 id与class定位1.2 定位一组元素 2、商品新增 一、HTML基础 可参考学习 链…...
利用软件I2C驱动OLED,点亮、熄灭OLED屏幕以及获取当前OLED屏幕开启状态
题目: 参考《I2C通信》的文档,自行连接电路,利用软件I2C驱动OLED,点亮、熄灭OLED屏幕以及获取当前OLED屏幕开启状态。 可以优先实现: 软件I2C初始化函数,用于初始化IO引脚 再实现: 主机发起始位和停止位,主机发送1个字节,…...
数据结构——栈与队列
1.栈 1.1概念 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO ( Last In First Out )的原则。 压栈:栈…...
【嵌入式系统设计师(软考中级)】第二章:嵌入式系统硬件基础知识(3)
文章目录 4. 嵌入式系统I/O接口4.1 GPIO与PWM接口4.1.1 GPIO接口(General-Purpose Input/Output)4.1.2 PWM接口(Pulse Width Modulation) 4.2 A/D与D/A接口的基本原理与结构4.2.1 DA转换(数模转换,Digital-…...
【网络安全】社会工程学策略
1. 社会工程学简介 社会工程攻击是威胁行为者常用的攻击方式。这是因为,诱骗人们提供访问权限、信息或金钱通常比利用软件或网络漏洞更容易。 您可能还记得,社会工程学是一种利用人为错误来获取私人信息、访问权限或贵重物品的操纵技术。它是一个涵盖性…...
ROS2---时间戳对齐
一、ROS2时间系统架构 时间模型 仿真时间(Simulation Time):由/clock话题驱动,适用于离线仿真与调试。真实时间(Real Time):基于系统硬件时钟,支持PTP协议(IEEE 1588&…...
C语言教程(十五):C 语言函数指针与回调函数详解
一、函数指针 1.1 函数指针的概念 在 C 语言中,函数指针是指向函数的指针变量。每个函数在内存中都有一个起始地址,函数指针就存储了这个起始地址,通过函数指针可以调用相应的函数。 1.2 函数指针的定义 函数指针的定义语法如下:返…...
VSCode如何修改默认扩展路径和用户文件夹目录到其他盘以及微信开发工具如何修改扩展路径到其他盘
ps:因公司电脑c盘内存严重不足,而出本篇文章 1.Visual Studio Code 随着VsCode的使用时间的推移,安装的扩展以及数据逐步增多,导致c盘内存占用较大,所以这里将vscode的默认缓存路径等迁移到其他盘。 步骤如下 1.找到默认的存储…...
抽象类相关
抽象类的定义 抽象类 是一种特殊的类,它不能被实例化,只能作为基类来派生出具体类。抽象类至少包含一个纯虚函数 。纯虚函数是在函数原型前加上 0 的虚函数,表示该函数没有具体实现,必须由派生类来实现。 抽象类的作用 提供统…...
如何测试短信接口
目录 一、测试短信接口的基本流程 1. 了解短信接口文档 2. 使用工具测试短信接口 示例一:用 curl 测试 POST 请求 示例二:用 Postman 设置 POST 请求 3. 编写测试脚本(Python 示例) 二、测试类型和场景 ✅ 正常发送测试 …...
pycharm2024.3.2项目解释器选择问题
问题描述:已经选择了pyau虚拟环境的解释器,运行了conda activate pyau,但是为什么关闭pycharm2024.3.2软件重新启动后,打开终端是(base) PS D:\deepseektest> ,为什么不是(pyau) PS D:\deepseektest> 解决问题&a…...
如何在 Dialog 中安全初始化 ECharts 并自动监听容器大小变化
如何在 Dialog 中安全初始化 ECharts 并自动监听容器大小变化 在使用 ECharts 的 Vue 项目中,我们常常会将图表放入弹窗(如 Element UI 的 <el-dialog>)中进行展示。但你是否遇到过以下问题: 图表初次显示尺寸异常&#x…...
如何借助ETL数据集成工具实现数据一致性?
主要可以从以下几个方面入手: 一、数据抽取阶段(Extract) 统一数据源连接方式:ETL工具通常支持多种数据源连接方式,如关系型数据库、非关系型数据库、文件系统、API接口等。在抽取数据时,要确保对各个数据…...
3.4/Q1,GBD数据库最新文章解读
文章题目:Burden of Carbon Monoxide Poisoning in Asian Countries From 1990 to 2021 and Its Projection Until 2030: An Analysis of the Global Burden of Disease Study 2021 DOI:10.2147/CLEP.S512786 中文标题:1990 年至 2021 年亚洲…...
【高中数学/古典概率】4红2黑六选二,求取出两次都是红球的概率
【问题】 袋子里装4只红球,2只黑球,大小完全相同,抽两次球,每次抽一只,抽出后不再放回,求取出的两次都是红球的概率。 【来源】 数林外传系列之《概率与期望》P20 单埻著 中国科学技术大学出版社 【数学…...
机器人操作中的生成式 AI:综述(上)
25年3月来自香港大学、香港理工、香港科大、浙大和清华大学的论文“Generative Artificial Intelligence in Robotic Manipulation: A Survey”。 本综述全面回顾机器人操作领域生成学习模型的最新进展,并探讨该领域的关键挑战。机器人操作面临着关键瓶颈ÿ…...
Spring AI 核心概念
本文是对Spring AI中涉及到的AI相关核心概念的介绍,笔者结合LangChain、LlamaIndex的使用经验,尝试尽可能清晰的把这些概念解释清楚. 读者也可以参考官方文档作为补充. 模型 提到AI模型,我们的第一印象一定是GPT,DeepSeek这样的大语言模型(…...