基于视觉识别 + ESP32 的夜间车辆检测与自适应远光灯(ADB)控制系统。
┌─────────────────┐ UART 500000 ┌─────────────────┐ ESP-NOW ┌─────────────────┐
│ 视觉识别模块 │ ──────────────────► │ ESP32 │ ──────────────► │ 透镜模块 │
│ (YOLOv5) │ 0-100 数值 │ (MCU) │ │ (左/右) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
| 功能 | 说明 |
|---|---|
| YOLOv5 目标检测 | 识别夜间车辆(汽车、摩托车) |
| 停车/行车检测 | 四区域混合检测算法 |
| 环境亮度感知 | Weber-Fechner 对数模型,0-100 |
| 目标平滑 | 防止检测闪烁,保持 12 帧 |
| 24 区域分区 | 画面水平分为 24 个控制区域 |
| 中心扩展遮光框 | CESB 动态框选效果 |
| LED 网格可视化 | 实时显示左右车灯 LED 状态 |
Center Expand Shade Box - 用于可视化遮光区域的动态框选效果。
工作原理:
画面中心
│
│◄──── 左框向左扩展
│
├────► 右框向右扩展
│
特性:
| 特性 | 说明 |
|---|---|
| 起始位置 | 画面中心 (X=270) |
| 扩展方向 | 左框向左,右框向右 |
| 扩展速度 | box_smooth_speed = 0.15 |
| 单向扩展 | 框只会变大,不会收缩 |
| 保持时间 | 目标消失后保持 50 帧 |
| Y 轴 | 跟随目标上下边界 |
参数调整:
box_smooth_speed = 0.15 # 扩展速度 (越小越慢)
box_hold_frames = 50 # 目标消失后保持帧数在画面底部显示两个 LED 网格,实时反映左右车灯的 LED 状态。
布局:
┌─────────────────────────────────────────────────┐
│ 画面内容 │
│ │
├─────────────────────────────────────────────────┤
│ [左灯 LED 网格] [右灯 LED 网格] │
│ ○○○○○○○○○○○○○○○○○○○○○○○○○○○○ ○○○○○○○○○○○○○○○○○○○○○○○○○○○○ │
│ ○○○○○○○○○○○○○○○○○○○○○○○○○○○○ ○○○○○○○○○○○○○○○○○○○○○○○○○○○○ │
│ ○○○○○○○○○○○○○○○○○○○○○○○○○○○○ ○○○○○○○○○○○○○○○○○○○○○○○○○○○○ │
│ ○○○○○○○○○○○○○○○○○○○○○○○○○○○○ ○○○○○○○○○○○○○○○○○○○○○○○○○○○○ │
└─────────────────────────────────────────────────┘
特性:
| 特性 | 说明 |
|---|---|
| 网格尺寸 | 28 列 x 4 行 |
| LED 直径 | 8 像素 |
| 点亮状态 | 白色圆点 |
| 遮挡状态 | 灰色圆点 |
| 联动 | 与 CESB 遮光框同步 |
参数调整:
LED_COLS = 28 # LED 列数
LED_ROWS = 4 # LED 行数
LED_SIZE = 8 # LED 直径
LED_GAP = 1 # LED 间距| 功能 | 说明 |
|---|---|
| 双 UART 接收 | 长焦 + 广角摄像头数据 |
| ESP-NOW 控制 | 无线控制左右透镜模块 |
| BLE 配置 | 蓝牙远程配置和调试 |
| 状态指示 | WS2812 LED 状态显示 |
| 数值 | 含义 |
|---|---|
| 0-12 | 目标在左半区,控制左透镜 |
| 13-23 | 目标在右半区,控制右透镜(值-12) |
| 99 | 无目标,全开远光 |
| 100 | 目标过多,关闭远光 |
设备 ID 格式: array996000100290X
- 左透镜: array9960001002908 (尾数 8)
- 右透镜: array9960001002916 (尾数 6)
控制命令 (ID + 控制码):
- 1-12: 调整角度档位 (adb1~adb12)
- 666: 开启远光
- 777: 关闭远光
- 100: 近光模式
- 摄像头: 1080x720 → 540x360
- 串口: /dev/ttyS0, 500000 波特率
- 模型: model_159818.mud
- uart_long: GPIO 5(RX), 4(TX) - 长焦
- uart_wide: GPIO 16(RX), 17(TX) - 广角
- LED: WS2812
stable_threshold = 0.95 # 稳定比例阈值
max_stable_count = 12 # 连续稳定次数 (约3秒)
check_interval = 5 # 每5帧检测一次smooth_frames = 5 # 目标消失后保持显示帧数conf_th = 0.5 # 置信度阈值
iou_th = 0.45 # IOU 阈值| 颜色 | 状态 |
|---|---|
| 绿色 | 无目标 |
| 红色 | 检测到目标 (≤3个) |
| 白色 | 目标过多 (>3个) |
| 黄色 | 停车模式 |
| 显示 | 含义 |
|---|---|
| 近/中/远 | 目标距离估算 |
| → | 目标向右移动(可能对向车) |
| ← | 目标向左移动(可能对向车) |
| 0.85 | 检测置信度 |
- 左下角: FPS
- 上方中间: 环境亮度 (L:0-100)
- 中心紫框: 亮度测量区域
- 中心黄块: 停车状态 (STOP)
| 参数 | 获取方式 | 对 ADB 的帮助 |
|---|---|---|
| 目标距离 | 检测框大小估算 | ✅ 已实现 |
| 对向/同向车 | 目标移动方向 | ✅ 已实现 |
| 接近速度 | 连续帧位置变化 | 预判目标轨迹 |
| 车灯类型 | 训练模型区分 | 区分远光灯、尾灯 |
| 画面对比度 | 图像统计 | 雨雾天气检测 |
maix/
├── adb-12-24.py # 视觉识别主程序
├── array_now/
│ ├── array_now.ino # ESP32 主程序
│ └── action.h # 动作定义
├── logo320.png # 启动 Logo
└── README.md # 本文档
MIT License