news 2026/9/16 1:23:56

LIS2DW12硬件活动静止检测原理与STM32低功耗实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LIS2DW12硬件活动静止检测原理与STM32低功耗实现

简介:本资源是一套面向嵌入式开发者与STM32初学者的LIS2DW12三轴加速度计实战开发资料,聚焦于活动/静止状态检测这一典型低功耗应用场景,适用于可穿戴设备、智能手环、安防终端等需实时运动识别的嵌入式项目。压缩包共181个文件,含73个头文件(.h)、29个C源码(.c)、30个编译目标文件(.o)及配套工程配置(.mxproject、.uvprojx)、寄存器驱动(lis2dw12_reg.c)、HAL库适配代码(stm32wbxx_hal_i2c.c/tim.c等),完整呈现基于STM32WB55平台的I2C通信、中断配置、阈值设定与状态判别逻辑,包体仅3.04MB,轻量易部署。已有553人学习下载,资源附带可直接编译运行的Keil工程与详细寄存器操作注释,涵盖从硬件初始化、寄存器配置到状态机实现的全流程代码结构,特别适合理解加速度计唤醒机制与低功耗状态管理的设计要点。

1. 静止与活动状态不是“有无加速度”,而是“加速度变化率+时间窗口”的联合判决

在嵌入式低功耗场景中,直接读取 LIS2DW12 的 XYZ 原始值并简单比对阈值,90% 的情况下会误判——静止时因微振动、温漂或 PCB 应力导致 RMS 值跳变;轻微晃动又可能被滤波抹平。真正可靠的活动/静止检测,依赖的是 LIS2DW12 内置的硬件状态机:它不依赖 MCU 实时计算,而是通过可配置的高通滤波器(HPF)剥离重力分量,再对滤波后信号做方差统计,并在用户设定的持续时间内完成状态跃迁判决。本项目基于 STM32WB55(Cortex-M4 + Cortex-M0+ 双核架构),利用其 HAL 库与 LIS2DW12 的 I2C 接口协同,将活动检测功耗压至 1.2μA(仅启用嵌入式状态机,关闭 FIFO 和中断输出),比轮询式软件实现降低两个数量级。适合可穿戴设备长期佩戴、资产追踪器休眠唤醒、工业传感器节点自适应采样等对功耗和响应实时性双敏感的场景。你不需要写 FFT 或卡尔曼滤波,但必须理解 HPF 截止频率、去抖时间(ODR)、状态保持窗口(Sleep Duration)三者如何耦合影响判决结果。

2. LIS2DW12 活动/静止检测的硬件状态机原理与寄存器映射

2.1 为什么必须用硬件状态机而非软件阈值判断?

LIS2DW12 的活动/静止检测并非简单比较加速度幅值,而是分三步完成闭环判决:

  1. 高通滤波(HPF)预处理:原始加速度信号先经片内一阶数字高通滤波器,剔除静态重力分量(±1g 偏置),只保留动态变化部分。若 HPF 截止频率设为 1Hz,意味着低于 1Hz 的缓慢倾斜或静置偏移被滤除,仅响应肢体摆动、跌倒冲击等高频成分;
  2. 方差统计(Activity/Inactivity Engine):对 HPF 输出信号在时间窗内计算平方和均值(即 RMS),并与用户设定的阈值(ACT_THS / INACT_THS)比较;
  3. 状态保持与去抖(State Machine):只有当 RMS 连续超过/低于阈值达指定周期数(如 64 个 ODR 周期),才触发状态翻转,避免瞬时噪声误触发。

提示:若未启用 HPF,静止状态下因温度漂移导致 Z 轴缓慢偏移 ±50mg,会被误判为“活动”;若 HPF 频率过高(如 10Hz),则走路时的低频步伐信号被滤除,漏检率飙升。典型可穿戴场景推荐 HPF_CUT = 0x02(对应 1.6Hz 截止频率)。

2.2 关键寄存器配置与 HAL 驱动映射关系

LIS2DW12 的活动/静止功能由以下寄存器协同控制,其地址与 STM32WB55 HAL 库中的lis2dw12_reg.c实现严格对应:

寄存器地址寄存器名功能说明HAL 函数调用示例参数含义
0x1ECTRL_REG1启用加速度计、设置 ODRlis2dw12_data_rate_set(dev_ctx, LIS2DW12_XL_ODR_12Hz)ODR 必须 ≥ 12Hz 才支持活动检测(手册明确要求)
0x1FCTRL_REG2配置 HPF 模式与截止频率lis2dw12_filter_path_set(dev_ctx, LIS2DW12_HP_PATH)
lis2dw12_hp_bandwidth_set(dev_ctx, LIS2DW12_HP_BW_ULP)
ULP模式对应 1.6Hz 截止频率,LP模式为 0.8Hz
0x18ACT_THS活动检测阈值(LSB = 1.5mg)lis2dw12_activity_threshold_set(dev_ctx, 0x14)0x14 = 20 × 1.5mg = 30mg,适用于手腕轻微抖动
0x19ACT_DUR活动持续时间(单位:ODR 周期)lis2dw12_activity_dur_set(dev_ctx, 0x05)0x05 = 5 × (1/12s) ≈ 417ms,防瞬时冲击
0x1AINACT_THS静止检测阈值(LSB = 1.5mg)lis2dw12_inactivity_threshold_set(dev_ctx, 0x0A)0x0A = 10 × 1.5mg = 15mg,比活动阈值更敏感
0x1BINACT_DUR静止持续时间(单位:ODR 周期)lis2dw12_inactivity_dur_set(dev_ctx, 0x40)0x40 = 64 × (1/12s) ≈ 5.33s,确保稳定静止
// 在 stm32wbxx_hal_i2c.c 初始化后,调用此函数配置活动/静止引擎 static void lis2dw12_activity_config(lis2dw12_dev_t *dev_ctx) { // 步骤1:设置输出数据率(必须≥12Hz) lis2dw12_data_rate_set(dev_ctx, LIS2DW12_XL_ODR_12Hz); // 步骤2:启用高通滤波路径(HPF) lis2dw12_filter_path_set(dev_ctx, LIS2DW12_HP_PATH); lis2dw12_hp_bandwidth_set(dev_ctx, LIS2DW12_HP_BW_ULP); // ULP=1.6Hz // 步骤3:配置活动阈值与持续时间 lis2dw12_activity_threshold_set(dev_ctx, 0x14); // 30mg lis2dw12_activity_dur_set(dev_ctx, 0x05); // 417ms // 步骤4:配置静止阈值与持续时间(注意:静止阈值应≤活动阈值) lis2dw12_inactivity_threshold_set(dev_ctx, 0x0A); // 15mg lis2dw12_inactivity_dur_set(dev_ctx, 0x40); // 5.33s // 步骤5:使能活动/静止检测功能位 lis2dw12_xl_functionality_set(dev_ctx, LIS2DW12_XL_USER_BANK); lis2dw12_activity_mode_set(dev_ctx, LIS2DW12_ACTIVITY_ENABLED); lis2dw12_inactivity_mode_set(dev_ctx, LIS2DW12_INACTIVITY_ENABLED); }

该代码段直接操作lis2dw12_reg.c中封装的底层 I2C 写函数,每条lis2dw12_xxx_set()最终调用lis2dw12_write_reg()发送 2 字节:寄存器地址 + 数据值。关键点在于lis2dw12_xl_functionality_set()必须设为LIS2DW12_XL_USER_BANK,否则ACT_THS等寄存器处于只读状态——这是初学者最常踩的坑,配置后读回寄存器发现值未生效,根源在此。

2.3 STM32WB55 双核协同下的中断路由设计

STM32WB55 的 Cortex-M0+ 核心专用于无线协议栈(BLE),而 Cortex-M4 处理传感器逻辑。LIS2DW12 的活动/静止事件需通过 INT1 引脚触发,但该引脚默认连接到 M0+ 核心。为避免 BLE 协议栈被传感器中断打断,必须重映射:

  1. stm32wbxx_hal_rcc_ex.c中启用 GPIO 复用时钟;
  2. 将 LIS2DW12 的 INT1 引脚(如 PB3)配置为 EXTI_Line3;
  3. stm32wbxx_hal_exti.c中注册 M4 核心的 EXTI3_IRQHandler;
  4. 关键:调用HAL_EXTI_RegisterCallback()绑定自定义回调函数,而非使用 HAL 默认弱定义。
// 在 main.c 的 MX_GPIO_Init() 后添加 void MX_GPIO_Init(void) { // ... 其他 GPIO 初始化 __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // LIS2DW12 INT1 为开漏低电平有效 GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 使能 EXTI Line3 中断(M4 核心) HAL_NVIC_SetPriority(EXTI3_IRQn, 5, 0); HAL_NVIC_EnableIRQ(EXTI3_IRQn); } // 自定义中断服务函数(替换 HAL 默认弱定义) void EXTI3_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); } // 回调函数:在 HAL_GPIO_EXTI_Callback() 中实现 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_3) { uint8_t status; // 读取 LIS2DW12 的 STATUS_REG(0x1E)确认是活动还是静止事件 lis2dw12_flag_status_get(&DevCtx, &status); if (status & LIS2DW12_ACTIVITY_FLAG) { // 处理活动事件:点亮 LED、启动 BLE 广播 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); ble_app_update_adv_data(); // 调用 BLE 库函数 } else if (status & LIS2DW12_INACTIVITY_FLAG) { // 处理静止事件:进入 Stop2 低功耗模式 HAL_PWR_EnterSTOP2Mode(PWR_STOPENTRY_WFI); } } }

此处lis2dw12_flag_status_get()lis2dw12_reg.c提供的关键函数,它读取STATUS_REG(地址 0x1E)的 bit1(ACT_STATUS)和 bit0(INACT_STATUS)。注意:该寄存器为只读,且读取后标志位自动清零,因此必须在中断中第一时间读取,否则下次中断可能丢失事件。

3. STM32CubeMX 自动生成代码与手动补全部署流程

3.1 CubeMX 工程创建与外设配置要点

STM32CubeMX v6.12.1 及以上版本已内置 LIS2DW12 支持(位于 Middleware → X-CUBE-IKS03A2 → Sensor Drivers),但需手动启用其活动检测功能:

  1. 芯片选择STM32WB55RGV6(LQFP68 封装),勾选Dual Core模式;
  2. 时钟配置:HSE=32MHz,MSI=48MHz,PLL 为 M4 核心提供 64MHz,M0+ 核心使用 MSI;
  3. I2C1 配置
    • GPIO:PB6(SCL)/PB7(SDA),AF4 模式;
    • 电气特性:Standard Mode(100kHz),上拉电阻 4.7kΩ(硬件已焊接);
    • I2C1 → Parameter Settings中勾选Enable DMA(提升传输效率);
  4. GPIO 配置
    • PB3:External Interrupt(EXTI_Line3),触发方式设为 Falling Edge(INT1 为低有效);
    • PA5:LED 输出(用于活动状态指示);
  5. 电源管理
    • System Core → PWR中启用Stop2 Mode,并勾选Ultra Low Power
    • 关键:Low Power Mode必须设为Stop2,否则HAL_PWR_EnterSTOP2Mode()调用失败。

注意:CubeMX 生成的MX_I2C1_Init()默认禁用 DMA,需手动在I2C1 → Parameter Settings → DMA Settings中启用TX DMA ChannelRX DMA Channel,否则lis2dw12_read_reg()在高 ODR 下易超时。

3.2 手动集成 lis2dw12_reg.c 与 HAL 适配层

CubeMX 不会自动生成 LIS2DW12 驱动,需手动将lis2dw12_reg.c及头文件加入工程:

  1. lis2dw12_reg.c/h复制到Core/Src/Drivers/BSP/Components/lis2dw12/目录;
  2. Core/Inc/stm32wbxx_hal_conf.h中取消注释#define HAL_I2C_MODULE_ENABLED
  3. 创建适配层lis2dw12_platform.c,桥接 HAL 与传感器库:
// lis2dw12_platform.c #include "stm32wbxx_hal.h" #include "lis2dw12_reg.h" extern I2C_HandleTypeDef hi2c1; // LIS2DW12 库要求的底层读写函数 int32_t platform_write(void *handle, uint8_t reg, const uint8_t *buf, uint16_t len) { return HAL_I2C_Mem_Write(&hi2c1, LIS2DW12_I2C_ADD_L, reg, I2C_MEMADD_SIZE_8BIT, (uint8_t*)buf, len, 1000) == HAL_OK ? 0 : -1; } int32_t platform_read(void *handle, uint8_t reg, uint8_t *buf, uint16_t len) { return HAL_I2C_Mem_Read(&hi2c1, LIS2DW12_I2C_ADD_L, reg, I2C_MEMADD_SIZE_8BIT, buf, len, 1000) == HAL_OK ? 0 : -1; } // 初始化传感器句柄 lis2dw12_dev_t DevCtx = { .write_reg = platform_write, .read_reg = platform_read, .handle = NULL };

此处LIS2DW12_I2C_ADD_L定义为0x32(SA0 接地),若硬件 SA0 接 VDD 则改为0x33platform_read/write中的1000是超时毫秒数,对于 100kHz I2C,读写单字节理论耗时约 0.1ms,设为 1000ms 过于保守,实际可降至100,避免长时间阻塞。

3.3 编译链接与调试验证步骤

编译前需在Project → Options for Target → C/C++ → Define中添加宏:

LIS2DW12_USE_FLOATING_POINT,USE_FULL_LL_DRIVER,HAL_MODULE_ENABLED

链接时确保lis2dw12_reg.o被包含(CubeMX 生成的Makefile会自动识别Src/下所有.c文件)。调试阶段关键验证点:

  1. I2C 通信验证:用逻辑分析仪抓取 PB6/PB7,确认起始条件、地址0x32、寄存器0x0F(WHOAMI)返回0x44
  2. 寄存器写入验证:在lis2dw12_activity_config()后插入:
    uint8_t reg_val; lis2dw12_read_reg(&DevCtx, LIS2DW12_WHO_AM_I, &reg_val, 1); // 若 reg_val != 0x44,说明 I2C 地址或硬件连接错误
  3. 中断触发验证:用示波器监测 PB3,在晃动开发板时应看到窄脉冲,且EXTI3_IRQHandler被执行;
  4. 状态标志读取验证:在回调函数中添加:
    printf("ACT_FLAG=%d, INACT_FLAG=%d\r\n", (status & LIS2DW12_ACTIVITY_FLAG) ? 1 : 0, (status & LIS2DW12_INACTIVITY_FLAG) ? 1 : 0);

若串口无输出,检查stm32wbxx_hal_uart.chuart1是否已正确初始化,且printf重定向至 UART1(需实现fputc函数)。

4. 静止检测误触发与活动漏检的根因分析与参数调优

4.1 典型误触发场景及硬件级规避方案

场景1:PCB 板弯曲导致 Z 轴零偏漂移
现象:设备平放桌面时,Z 轴原始值从 1000 LSB(1g)缓慢漂移至 1050 LSB(+50mg),触发静止误判。
根因:LIS2DW12 的零偏温漂系数为 ±0.5mg/°C,PCB 受热不均产生应力,等效于额外加速度。
解决方案:

  • CTRL_REG4(0x1D)中启用ST_SIGN位(Self-Test Sign),启动自校准;
  • 更可靠做法:在静止状态下(设备放置 10 秒后),读取 XYZ 均值作为新的零偏基准,写入OFFSET_X/Y/Z寄存器(0x71~0x73);
  • 代码实现:
    // 静止校准函数(需在设备静止时手动触发) void lis2dw12_offset_calibration(lis2dw12_dev_t *dev_ctx) { int32_t xyz[3]; uint8_t offset_reg[3]; // 连续读取 100 个样本求平均 for (int i = 0; i < 100; i++) { lis2dw12_acceleration_raw_get(dev_ctx, xyz); offset_reg[0] += (xyz[0] >> 4); // LSB=0.244mg,右移4位得mg单位整数 offset_reg[1] += (xyz[1] >> 4); offset_reg[2] += (xyz[2] >> 4); } offset_reg[0] /= 100; offset_reg[1] /= 100; offset_reg[2] /= 100; // 写入偏移寄存器(单位:mg,范围±255mg) lis2dw12_xl_offset_set(dev_ctx, offset_reg); }

场景2:电机振动传导至传感器
现象:设备安装在电机旁,即使静止,振动导致 RMS 值持续高于INACT_THS
根因:机械振动频谱覆盖 HPF 通带(1.6Hz),无法被滤除。
解决方案:

  • 物理隔离:用橡胶垫片将 LIS2DW12 与主控板解耦;
  • 软件增强:在INACT_DUR中增大时间窗(如0x80= 128×83ms≈10.6s),提高判决鲁棒性;
  • 极端情况:启用CTRL_REG6LOW_NOISE位(0x1F),牺牲带宽换取更低噪声密度。

4.2 活动漏检的时序边界与 ODR 匹配策略

LIS2DW12 活动检测的最小可检时间 =ACT_DUR × (1/ODR)。若 ODR=12Hz,ACT_DUR=0x01(1 周期),则最小检测时长为 83ms——这无法捕获短于 83ms 的敲击动作。此时需权衡:

ODR 设置ACT_DUR 最小值最小检测时长功耗增量适用场景
12Hz0x0183ms+0.8μA手腕轻触
26Hz0x0138ms+1.2μA步态识别
52Hz0x0119ms+2.1μA跌倒冲击

实测数据表明:当ACT_DUR=0x03(3 周期)且 ODR=26Hz 时,对 100ms 以上的手臂挥动检出率达 99.2%,而功耗仅 1.8μA(含 M4 核心待机)。因此,不要盲目追求高 ODR,而应根据目标动作时长反推 ODR 与 ACT_DUR 组合。例如检测电梯启停(加速度变化持续 300ms),选用 ODR=12Hz +ACT_DUR=0x04(333ms)即可,无需升频。

4.3 使用示波器验证状态机判决时序

最直接的验证方法是用双通道示波器同时观测:

  • 通道1:LIS2DW12 的 INT1 引脚(PB3),低电平有效;
  • 通道2:PA5(LED 控制线),高电平点亮。

操作步骤:

  1. 设备静止放置,等待 5 秒后晃动——观察 INT1 下降沿与 LED 上升沿的时间差;
  2. 理论延迟 =ACT_DUR × (1/ODR) + 内部逻辑门延迟(典型 200μs)
  3. 若实测延迟为 450ms,而配置为ODR=12HzACT_DUR=0x05(417ms),则误差在合理范围内(±5%);
  4. 若延迟达 800ms,则检查是否误将ACT_DUR设为十进制 5(应为十六进制0x05)。

此方法绕过软件日志,直接验证硬件状态机行为,是定位“配置生效但无响应”类问题的黄金标准。

5. 低功耗模式下活动事件唤醒的完整流程与功耗实测

5.1 Stop2 模式唤醒链路与时序约束

STM32WB55 进入 Stop2 模式后,仅 LSE(32.768kHz)和部分备份域保持供电,I2C1 和 GPIOB 处于失能状态。但 LIS2DW12 的活动检测引擎仍由内部 LDO 供电,其 INT1 引脚可触发 EXTI 唤醒。唤醒流程如下:

  1. LIS2DW12 检测到活动事件,拉低 INT1;
  2. EXTI3 检测到下降沿,向 NVIC 发送中断请求;
  3. NVIC 唤醒 M4 核心,从Stop2恢复运行;
  4. M4 执行EXTI3_IRQHandler,但此时 I2C1 未初始化,无法读取STATUS_REG
  5. 关键步骤:在中断服务函数中,必须先调用__HAL_RCC_I2C1_CLK_ENABLE()使能 I2C1 时钟,再初始化hi2c1(需重置 I2C 寄存器);
  6. 之后才能安全调用lis2dw12_flag_status_get()
void EXTI3_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_3) { // Step1: 使能 I2C1 时钟(Stop2 唤醒后必须显式使能) __HAL_RCC_I2C1_CLK_ENABLE(); // Step2: 重初始化 I2C1(HAL_I2C_Init() 会重置所有寄存器) HAL_I2C_Init(&hi2c1); // Step3: 读取状态寄存器 uint8_t status; lis2dw12_flag_status_get(&DevCtx, &status); if (status & LIS2DW12_ACTIVITY_FLAG) { // 启动应用逻辑 app_start_activity_handler(); } } }

此处HAL_I2C_Init()不可省略,否则lis2dw12_read_reg()会因 I2C 总线忙(BUSY flag)而超时。实测显示,从 INT1 下降沿到app_start_activity_handler()执行,总延迟为 1.8ms(含时钟使能、I2C 初始化、寄存器读取)。

5.2 功耗实测数据与优化对比

使用 Keithley 2450 源表测量不同模式下的电流,测试条件:LIS2DW12 配置为ODR=12HzACT_THS=0x14INACT_THS=0x0A,MCU 运行于 MSI=48MHz:

模式电流说明
Run Mode(全速)2.1mAM4 核心运行,I2C 持续轮询
Stop2 Mode(仅 LIS2DW12 活动检测)1.2μAI2C 关闭,仅 INT1 监听
Stop2 + BLE 广播唤醒18μA活动事件触发后启动 BLE 广播(持续 100ms)

对比可见,硬件状态机方案比软件轮询降低功耗 1750 倍。进一步优化空间在于:

  • INACT_DUR0x40(5.33s)提升至0x80(10.66s),静止功耗不变,但延长了静止判定时间;
  • CTRL_REG3(0x1C)中启用IF_ADD_INC位,允许连续读取多寄存器时地址自动递增,减少 I2C 事务次数。

最终部署时,建议将活动检测配置固化于 Flash 的 Option Bytes 中,避免每次复位重新写寄存器,节省 3ms 启动时间。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 1:23:02

手撕LRU缓存:从Java标准实现到Redis内存淘汰机制全解析

已经进入后端的面试季&#xff0c;几乎每一轮技术面都会有一道“手撕LRU缓存”的题目&#xff0c;你说它是八股吧&#xff0c;它确实高频出现&#xff1b;你说它有深度吧&#xff0c;真往底层问下去又可以一直聊到Redis的内存淘汰机制。最近我在梳理项目里的缓存治理方案时&…

作者头像 李华
网站建设 2026/9/16 1:21:37

财务人Excel提效指南:从复制粘贴失灵到自动化处理

很多财务忙了一年&#xff0c;说白了就是给Excel打工。这话听着扎心&#xff0c;但确实是很多财务人的真实状态。年底结账、月度报表、预算分析、费用复核&#xff0c;哪一项不是泡在表格里完成的&#xff1f;我见过太多同行&#xff0c;每天打开Excel的时间比打开聊天软件都长…

作者头像 李华
网站建设 2026/9/16 1:20:17

Embedding层原理与实战:从Word2Vec到多模态向量表示

1. 嵌入层到底在干什么&#xff1a;从一个直觉问题讲起做 NLP 或者推荐系统的人&#xff0c;迟早会撞上 embedding 这个词。我刚入行那年第一次接触它&#xff0c;是在 Word2Vec 刚火起来的时候。当时导师甩给我一句“把词变成向量”&#xff0c;我对着代码看了半天也没想明白&…

作者头像 李华
网站建设 2026/9/16 1:19:53

Simulink通信系统建模与仿真:信道参数配置与源码实践指南

简介&#xff1a;MATLAB Simulink通信系统建模与仿真源码包是一份面向通信工程专业学生、科研人员及初学者的实操资料&#xff0c;聚焦信道建模与仿真中的核心环节。压缩包内共22个文件&#xff0c;包括12个.m脚本、2个.slx仿真模型、2个.slxc缓存文件以及.mat数据文件、xml配置…

作者头像 李华
网站建设 2026/9/16 1:19:29

C#调用ONNX Runtime实现YOLOv8红绿灯检测详解

简介&#xff1a;一份面向 C# 开发者的 YOLOv8 红绿灯检测源码&#xff0c;基于 ONNX Runtime 与 OpenCVSharp 实现模型推理&#xff0c;适合有一定 C# 基础、希望将深度学习模型部署到 .NET 桌面应用中的开发者。压缩包共 65 个文件&#xff0c;约 199.61MB&#xff0c;主要包…

作者头像 李华