车牌识别系统 - 基于HyperLPR3/MNN的嵌入式C++车牌识别平台,支持多路RTSP视频流、飞书消息推送、MQTT、Web管理、重量调度、登录认证等功能
|
|
hai 1 día | |
|---|---|---|
| assets | hai 4 días | |
| config | hai 4 días | |
| scripts | hai 4 días | |
| src | hai 1 día | |
| third_party | hai 4 días | |
| CHANGELOG.md | hai 1 día | |
| CMakeLists.txt | hai 4 días | |
| README.md | hai 1 día | |
| sync_to_gogs.sh | hai 1 día |
基于 HyperLPR3 / MNN 的嵌入式 C++ 车牌识别平台,运行于树莓派5 + Ubuntu 24.04
版本: fix27 v44 | 最后更新: 2026-08-30
Gogs 仓库: https://git.zhonjin.com:40717/steven_roc/PlateRecApp
PlateRecApp 是一套面向工业园区/物流场站的全功能车牌识别与称重管理系统。支持多路 RTSP 视频流实时识别、飞书消息推送、MQTT 数据上报、Web 管理后台、登录认证、frpc 内网穿透管理等核心功能。
| 模块 | 功能说明 |
|---|---|
| 车牌识别 | HyperLPR3 + MNN 推理引擎,支持低位/高位摄像头 ROI 裁剪推理 |
| 视频流 | 4路独立 RTSP 视频流 (前/侧 × 进/出) + Web 端 ROI 手动调整 |
| 飞书推送 | 进出站消息推送,支持携带重量信息,独立开关控制 (g_feishu_enabled) |
| MQTT | 数据上报到 MQTT Broker,独立开关控制 (g_mqtt_enabled),v43 并行模式支持 |
| 称重系统 | TCP 连接称重仪表,重量调度器 (promise/future 异步机制),预检测锁定 (fix27 v44) |
| Web 管理 | 登录认证、系统监控、日志管理、frpc 管理、SSH 密钥管理、ROI 调整 |
| 站点锁 | 交替锁定机制 (AlternatingMerge),防止重复抓拍竞态,2小时超时清零 |
| 时间窗口 | TIME_WINDOW 工单配额管理,支持 SQLite 持久化缓存 |
| 并行同步 | fix24 v43 并行同步引擎,API创建工单+照片上传+飞书通知并行执行 |
| 日志管理 | logrotate 自动清理,内存缓冲区+定时刷盘,系统指标历史记录 |
| 安全认证 | bcrypt 密码哈希 + Session + CSRF 防护 + 速率限制 + 三级角色控制 |
┌──────────────────────────────────────────────────────────────┐
│ PlateRecApp │
├───────────┬───────────┬───────────┬──────────────────────────┤
│ 车牌识别 │ 重量调度 │ Web服务 │ 消息推送 │
│ HyperLPR3 │ 异步引擎 │ 认证+监控 │ 飞书 / MQTT (独立开关) │
│ +MNN推理 │ promise/ │ cpp-httplib│ │
│ │ future │ +SSL/HTTPS │ │
├───────────┴───────────┴───────────┴──────────────────────────┤
│ 统一配置管理 (config.ini) │
├──────────────────────────────────────────────────────────────┤
│ SQLite DB │ MQTT Client │ RTSP Capture (FFmpeg/DRM硬解) │
└──────────────────────────────────────────────────────────────┘
│ │ │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
│ 飞书API │ │MQTT Brkr│ │ RTSP摄像头│
└─────────┘ └─────────┘ └─────────┘
RTSP视频流 → 帧抓取(rtsp_capture) → ROI裁剪 → HyperLPR3推理
↓
车牌识别结果 → 去重检查 → 交替锁定检查 → 创建工单(API)
↓ ↓
照片保存(SQLite记录) ← 联单编号(tb_num) ← API返回
↓
并行同步引擎(v43):
├── 照片上传 → API
├── 飞书通知 → 飞书Bot
└── MQTT上报 → MQTT Broker
| 项目 | 要求 |
|---|---|
| 硬件 | 树莓派5 8G(兼容 Ubuntu-24.04 / Raspberry Pi OS) |
| 编译器 | GCC 11+, C++17 |
| 核心依赖 | OpenCV 4.x, MNN, HyperLPR3 SDK |
| 其他依赖 | cJSON, cpp-httplib, bcrypt, ini-parser, FFmpeg (DRM硬解) |
| 数据库 | SQLite3 |
| 网络 | 飞书 API, MQTT Broker, RTSP 视频流, 称重仪表 (TCP) |
PlateRecApp/
├── src/ # 源代码
│ ├── main.cpp # 主程序入口 (信号处理+主循环+清理)
│ ├── common.cpp/h # 公共定义与全局变量 (枚举/结构体/常量)
│ ├── config.cpp/h # 配置文件解析 (config.ini, 大小写不敏感)
│ ├── plate_recognizer.cpp/h # 车牌识别核心 (HyperLPR3+MNN推理)
│ ├── rtsp_capture.cpp/h # RTSP 视频流采集 (FFmpeg+DRM硬解)
│ ├── web_server.cpp/h # Web 管理服务器 (cpp-httplib+SSL)
│ ├── database.cpp/h # SQLite 数据库操作 (上传记录/时间窗口缓存)
│ ├── feishu_client.cpp/h # 飞书消息推送客户端 (curl)
│ ├── mqtt_client.cpp/h # MQTT 客户端 (mosquitto)
│ ├── weight_dispatcher.cpp/h # 重量调度器 (promise/future异步)
│ ├── weight_scale.cpp/h # 称重模块 (TCP连接仪表)
│ ├── station_lock.cpp/h # 站点交替锁定机制 (内存+SQLite持久化)
│ ├── system_monitor.cpp/h # 系统监控 (CPU/内存/温度/磁盘)
│ ├── system_metrics_manager.cpp/h # 系统指标管理+历史记录
│ ├── log_manager.cpp/h # 日志管理+logrotate (内存缓冲+定时刷盘)
│ ├── frpc_manager.cpp/h # frpc 内网穿透管理 (配置热更新+自动回滚)
│ ├── ssh_manager.cpp/h # SSH 密钥管理 (authorized_keys读写)
│ ├── network_client.cpp/h # 网络客户端 (API创建工单+照片上传)
│ ├── utils.cpp/h # 工具函数 (帧去重/时间窗口/重试策略)
│ ├── auth_api.cpp/h # 认证 API (登录/登出/状态)
│ ├── auth_db.cpp/h # 认证数据库 (用户表+审计日志)
│ ├── auth_session.cpp/h # 会话管理 (Session ID + CSRF Token)
│ ├── auth_middleware.cpp/h # 认证中间件 (路由守卫+角色控制)
│ ├── auth_crypto.cpp/h # 加密工具 (bcrypt 哈希+验证)
│ ├── auth_rate_limiter.h # 速率限制 (防暴力破解)
│ └── bcrypt/ # bcrypt 密码哈希库
├── config/ # 配置示例
│ ├── config一号门.ini # 一号门配置模板
│ └── config二号门.ini # 二号门配置模板
├── scripts/ # 部署脚本
│ ├── deploy.sh # 一键部署脚本 (systemd service)
│ ├── reset_passwords.py # Web 管理密码重置工具
│ └── setup_frpc_sudoers.sh # frpc sudoers 配置
├── third_party/ # 第三方依赖源码
│ ├── cJSON.c/h # JSON 解析
│ ├── cvxFont.cpp/h # OpenCV 中文字体
│ ├── httplib.h # cpp-httplib 头文件库
│ ├── hyper_lpr_sdk.h # HyperLPR3 SDK 头文件
│ ├── ini.c/h # INI 配置解析
│ └── md5ex1.c/h # MD5 工具
├── assets/web/ # Web 前端资源 (HTML/CSS/JS)
│ ├── index.html # 首页仪表盘
│ ├── login.html # 登录页面
│ ├── monitor.html # 系统监控
│ ├── frpc.html # frpc 管理
│ ├── ssh.html # SSH 密钥管理
│ ├── logs.html # 日志查看
│ ├── video.html # 视频预览
│ ├── weight.html # 称重记录
│ └── config.html # 配置管理
├── sync_to_gogs.sh # Gogs 自动同步脚本
├── CMakeLists.txt # CMake 构建配置
├── CHANGELOG.md # 详细变更日志
└── README.md # 本文件
git clone https://git.zhonjin.com:40717/steven_roc/PlateRecApp.git
cd PlateRecApp
mkdir build && cd build
cmake ..
make -j4
编译产物: build/PlateRecApp 可执行文件
# 复制配置模板并修改
cp config/config一号门.ini /opt/openAI/project/003.PlateRecAPP/config.ini
# 编辑 config.ini 填入实际参数(见下方配置说明)
sudo bash scripts/deploy.sh
deploy.sh 会自动:
/opt/openAI/project/003.PlateRecAPP/# 检查服务状态
sudo systemctl status PlateRecApp
# 查看运行日志
sudo journalctl -u PlateRecApp -f
# 访问 Web 管理
# http://<设备IP>:8080 (HTTP) 或 https://<设备IP>:8443 (HTTPS)
核心配置通过 config.ini 管理,支持以下配置段:
[config]
project_name = 一号门站 # 项目名称(日志标识)
point_number = P001 # 站点编号(API上报)
throughway = 1 # 通道号
# RTSP 视频流地址(4路:前/侧 × 进/出)
rtsp_url_front_in = rtsp://admin:xxx@192.168.1.101:554/stream1
rtsp_url_front_out = rtsp://admin:xxx@192.168.1.102:554/stream1
rtsp_url_side_in = rtsp://admin:xxx@192.168.1.103:554/stream1
rtsp_url_side_out = rtsp://admin:xxx@192.168.1.104:554/stream1
# API 配置
app_api = https://api.example.com/v1
app_key = your_app_key
app_secret = your_app_secret
# 运行模式
DEBUG_LOG = 0 # 0=正式运行, 1=调试模式(详细日志)
TestFlag = 0 # 0=正式环境, 1=测试环境
wType = 1 # 称重类型 (1=类型A, 3=类型B)
# 时间窗口与配额
TIME_WINDOW = 5 # 时间窗口(分钟),同一车牌5分钟内仅处理1次
MAX_PHOTO_GROUPS = 3 # 每侧最多保存照片组数
in_out_interval = 5 # 进出站间隔(分钟),交替锁定等待时间
# 车牌识别
PLATE_CONFIDENCE_THRESHOLD = 0.5 # 识别置信度阈值
PLATE_LOG_THRESHOLD = 0.3 # 日志记录阈值
# 交替锁定
AlternatingMerge = 1 # 1=启用交替锁定(推荐)
# ROI 区域 (像素坐标)
roi_in_x = 100 roi_in_y = 200
roi_in_w = 800 roi_in_h = 600 roi_in_enabled = 1
roi_out_x = 100 roi_out_y = 200
roi_out_w = 800 roi_out_h = 600 roi_out_enabled = 1
roi_debug_enabled = 0 # 1=显示ROI调试框
# 硬件解码
hw_decode_mode = drm # auto/drm/soft
hw_decode_device = /dev/dri/card0 # DRM设备路径
rtsp_transport = tcp # rtsp传输协议
# 文件清理
PhotoMaxCapacityMB = 2048 # 照片目录最大容量(MB),超出自动清理旧文件
LogRetentionDays = 30 # 日志保留天数
[feishu]
ENABLED = 1 # 1=启用飞书消息推送
APP_ID = cli_xxx # 飞书应用 App ID
APP_SECRET = xxx # 飞书应用 App Secret
CHAT_ID = oc_xxx # 目标群聊 Chat ID
TIMEOUT_SECOND = 10 # HTTP 请求超时(秒)
WarningSigns = 0 # 1=抑制紧急告警
[mqtt]
MQTT_ENABLED = 1 # 1=启用MQTT消息推送
MQTT_HOST = broker.example.com # MQTT Broker 地址
MQTT_PORT = 1883 # MQTT Broker 端口
MQTT_USER = user # 用户名
MQTT_PASS = password # 密码
MQTT_TOPIC = plate_rec/data # 发布主题
MQTT_CLIENT_ID = PlateRecApp_01 # 客户端ID
PLATE_COLOR = 绿色 # 车牌颜色
VEHICLE_TYPE = 渣土车 # 车辆类型
[weight]
flagWeight = 1 # 飞书消息是否携带重量信息
weight_threshold_in = 500 # 进站重量阈值(kg),低于此值不触发称重
weight_threshold_out = 300 # 出站重量阈值(kg)
default_entry_weight = 15000 # 默认进站重量(kg)
default_exit_weight = 5000 # 默认出站空车重量(kg)
weight_detection_time = 15 # 称重检测等待时间(秒)
tcp_connect_timeout = 5 # TCP连接超时(秒)
weight_server_ip = 192.168.1.200 # 称重仪表IP
weight_server_port = 502 # 称重仪表端口
MAX_WEIGHT = 60000 # 最大有效重量(kg)
STABLE_SAMPLE_COUNT = 5 # 稳定采样次数
STABLE_THRESHOLD_KG = 50 # 稳定判定阈值(kg)
CANDIDATE_DATA_COUNT = 10 # 候选数据计数
MAX_UPLOAD_RETRIES = 3 # 最大上传重试次数
RETRY_DELAY_MS = 2000 # 重试间隔(毫秒)
# 预检测锁定 (fix27 v44 P0)
PRELOCK_THRESHOLD_KG = 5000 # 预检测阈值(kg),超过此值启动预锁定
# 设为0则禁用预检测
PRELOCK_STABLE_SAMPLES = 3 # 预检测稳定采样次数 (2-20)
[sync]
enabled = 1 # 1=并行同步(v43), 0=串行同步(v41)
reporter_timeout_sec = 30 # 上报超时(秒)
weight_retry_max = 2 # 重量获取最大重试次数
weight_retry_interval_sec = 3 # 重量重试间隔(秒)
tb_num_dedup_sec = 60 # 联单编号去重窗口(秒)
weight_snapshot_max_age_sec = 60 # 重量快照最大年龄(秒)
[server]
ip = http://0.0.0.0:8080 # Web服务监听地址(自动解析端口)
[ssl]
enabled = 1 # 1=启用HTTPS
cert_path = /path/to/cert.pem # SSL证书路径
key_path = /path/to/key.pem # SSL私钥路径
[auth]
enabled = 1 # 1=启用登录认证
db_path = data/auth.db # 认证数据库路径
[system]
monitor_interval = 30 # 监控采样间隔(秒)
temp_alert_threshold = 75 # 温度告警阈值(℃)
cpu_alert_threshold = 85 # CPU使用率告警阈值(%)
db_path = data/system_metrics.db # 指标数据库路径
history_retention_days = 30 # 历史记录保留天数
aggregation_retention_days = 365 # 聚合数据保留天数
flush_time = 02:00 # 每日刷盘时间
[frpc]
config_path = /etc/frpc/frpc.ini # frpc配置文件路径
backup_path = /opt/frpc_backup/ # 配置备份目录
protected_tunnels = web,ssh # 受保护的隧道(不可删除)
restart_check_timeout = 5 # 重启后检查超时(秒)
auto_rollback = 1 # 配置失败自动回滚
web_enabled = 1 # 启用frpc Web管理
admin_addr = 127.0.0.1 # admin API监听地址(仅本机)
admin_port = 7400 # admin API端口
admin_user = admin # admin用户名
admin_password = xxx # admin密码
[terminal]
ttyd_port = 7681 # ttyd Web终端端口
ttyd_credential = admin:admin # ttyd认证凭据
ttyd_max_clients = 3 # 最大连接数
ssh_keys_path = /root/.ssh/authorized_keys
[log]
enabled = 1 # 1=启用内存缓冲日志
log_file = /var/log/PlateRecApp.log # 日志文件路径
buffer_size_mb = 20 # 内存缓冲区大小(MB)
flush_time = 02:00 # 每日刷盘时间
retention_days = 30 # 日志保留天数
redirect_stdout = 1 # 1=重定向stdout到日志
auto_flush_on_exit = 1 # 1=退出时自动刷盘
| 功能 | 路径 | 权限 | 说明 |
|---|---|---|---|
| 首页仪表盘 | / |
所有用户 | 系统概览、最新抓拍、统计信息 |
| 登录认证 | /login |
公开 | 超级管理员/管理员/普通用户三角色 |
| 系统监控 | /monitor |
超级管理员 | CPU/内存/磁盘/温度实时监控 |
| frpc 管理 | /frpc |
超级管理员 | 内网穿透服务配置+热更新 |
| SSH 密钥 | /ssh |
超级管理员 | Web 端 SSH 公钥管理 |
| 日志管理 | /logs |
超级管理员 | 在线查看 + logrotate |
| ROI 调整 | /roi |
所有用户 | Web 端 4 路视频 ROI 手动调整 |
| 视频预览 | /video |
公开 | 实时视频流预览 (MJPEG) |
| 称重记录 | /weight |
公开 | 称重数据查询 |
| 配置管理 | /config |
管理员 | 在线修改配置参数 |
| 锁定管理 | /locks |
管理员 | 查看/清除交替锁定状态 |
| 角色 | 级别 | 用户名 | 密码 | 权限 |
|---|---|---|---|---|
| 普通用户 | role=0 | zhonjin | zhonjin | 首页/视频/称重等基础页面 |
| 管理员 | role=1 | - | - | 基础页面 + 配置/锁定管理 |
| 超级管理员 | role=2 | admin | zhonjin188A | 所有页面(含系统/frpc/SSH/日志) |
⚠️ 首次部署后务必通过
scripts/reset_passwords.py修改默认密码
g_feishu_enabled) 控制项目包含 sync_to_gogs.sh 脚本,支持自动同步代码到 Gogs 仓库。
为安全起见,建议通过环境变量传递 Access Token:
# 方式1: 导出环境变量(推荐)
export GOGS_ACCESS_TOKEN="your_access_token_here"
# 方式2: 直接在命令中指定
GOGS_ACCESS_TOKEN="xxx" bash sync_to_gogs.sh
# 方式3: 使用默认值(脚本内已内置,但不推荐)
bash sync_to_gogs.sh
bash sync_to_gogs.sh "commit message here"
# 配置 remote(已配置则跳过)
git remote set-url origin "https://steven_roc:YOUR_TOKEN@git.zhonjin.com:40717/steven_roc/PlateRecApp.git"
# 推送代码
git add -A
git commit -m "your commit message"
git push origin master
| 版本 | 日期 | 主要内容 |
|---|---|---|
| fix27 v44 | 2026-08-30 | 飞书消息携带重量、水印居中修复、MQTT修复、内存泄漏修复、共享摄像头方向修复、空指针保护 |
| fix26 v44 | 2026-08-30 | 飞书/MQTT独立开关控制 |
| fix25 v44 | 2026-08-30 | P0 预检测锁定优化 (prelock) |
| fix24 v43 | 2026-08-30 | 并行同步引擎、系统指标历史、日志管理 |
| fix24 v32-v41 | 2026-07~08 | Web管理、认证系统、frpc管理、SSH密钥 |
| fix24 v21 | 2026-07-03 | P0 时间对齐 bug 修复 (fix24-v21) |
| fix18 | 2026-07-06 | 重复抓拍竞态修复、4路视频流+Web ROI、MQTT合并主进程 |
| fix17 | 2026-07-06 | 交替锁定2小时超时清零 |
| V5 fix19 | 2026-06-25 | 基础版本 |
详细变更记录请查看 CHANGELOG.md
本项目为内部使用项目,未经授权不得外部分发。