车牌识别系统 - 基于HyperLPR3/MNN的嵌入式C++车牌识别平台,支持多路RTSP视频流、飞书消息推送、MQTT、Web管理、重量调度、登录认证等功能
|
|
15 uur geleden | |
|---|---|---|
| PlateJPG | 15 uur geleden | |
| assets | 15 uur geleden | |
| data | 15 uur geleden | |
| scripts | 15 uur geleden | |
| src | 23 uur geleden | |
| ssl | 15 uur geleden | |
| third_party | 1 dag geleden | |
| .gitignore | 15 uur geleden | |
| CHANGELOG.md | 1 dag geleden | |
| CMakeLists.txt | 1 dag geleden | |
| INSTALL_RPI5.md | 23 uur geleden | |
| README.md | 1 dag geleden | |
| TECH_DOC.md | 23 uur geleden | |
| config.ini | 15 uur geleden | |
| config.txt | 15 uur geleden | |
| deploy.sh | 15 uur geleden | |
| sync_to_gogs.sh | 1 dag geleden | |
| 车牌识别系统_技术问答归档.md | 23 uur geleden |
基于 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 手动调整 |
| 飞书推送 | 进出站消息推送,支持携带重量信息,独立开关控制 |
| MQTT | 数据上报,独立开关控制,v43 并行模式支持 |
| 称重系统 | 重量调度器(promise/future 异步机制),15秒超时 |
| Web 管理 | 登录认证、系统监控、日志管理、frpc 管理、SSH 密钥管理 |
| 站点锁 | 交替锁定机制,防止重复抓拍竞态 |
| 日志管理 | logrotate 自动清理,系统指标历史记录 |
┌─────────────────────────────────────────────────────┐
│ PlateRecApp │
├──────────┬──────────┬──────────┬────────────────────┤
│ 车牌识别 │ 重量调度 │ Web服务 │ 飞书/MQTT推送 │
│ HyperLPR3│ 异步引擎 │ 认证+监控 │ 独立开关控制 │
├──────────┴──────────┴──────────┴────────────────────┤
│ 统一配置管理 (config.ini) │
├─────────────────────────────────────────────────────┤
│ SQLite DB │ MQTT Client │ RTSP Capture │
└─────────────────────────────────────────────────────┘
| 项目 | 要求 |
|---|---|
| 硬件 | 树莓派5 8G(兼容 Ubuntu-24.04 / Raspberry Pi OS) |
| 编译器 | GCC 11+, C++17 |
| 核心依赖 | OpenCV 4.x, MNN ≥2.0, HyperLPR3 SDK |
| 其他依赖 | cJSON, cpp-httplib, bcrypt, ini-parser, FFmpeg, FreeType2, mosquitto |
| 数据库 | SQLite3 |
| 网络 | 飞书 API, MQTT Broker, RTSP 视频流, cURL, OpenSSL |
PlateRecApp/
├── src/ # 源代码
│ ├── main.cpp # 主程序入口
│ ├── common.cpp/h # 公共定义与全局变量
│ ├── config.cpp/h # 配置文件解析 (config.ini)
│ ├── plate_recognizer.cpp/h # 车牌识别核心 (HyperLPR3+MNN)
│ ├── rtsp_capture.cpp/h # RTSP 视频流采集
│ ├── web_server.cpp/h # Web 管理服务器 (cpp-httplib)
│ ├── database.cpp/h # SQLite 数据库操作
│ ├── feishu_client.cpp/h # 飞书消息推送客户端
│ ├── mqtt_client.cpp/h # MQTT 客户端
│ ├── weight_dispatcher.cpp/h # 重量调度器 (promise/future)
│ ├── weight_scale.cpp/h # 称重模块
│ ├── station_lock.cpp/h # 站点交替锁定机制
│ ├── 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 密钥管理
│ ├── network_client.cpp/h # 网络客户端 (API上传)
│ ├── utils.cpp/h # 工具函数
│ ├── auth_api.cpp/h # 认证 API
│ ├── auth_db.cpp/h # 认证数据库
│ ├── auth_session.cpp/h # 会话管理
│ ├── auth_middleware.cpp/h # 认证中间件
│ ├── auth_crypto.cpp/h # 加密工具 (bcrypt)
│ ├── auth_rate_limiter.h # 速率限制
│ └── bcrypt/ # bcrypt 密码哈希库
├── config/ # 配置示例
│ ├── config一号门.ini # 一号门配置模板
│ └── config二号门.ini # 二号门配置模板
├── scripts/ # 部署脚本
│ ├── deploy.sh # 一键部署脚本
│ ├── 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)
├── CMakeLists.txt # CMake 构建配置
├── CHANGELOG.md # 详细变更日志
└── README.md # 本文件
本项目车牌识别核心依赖 MNN(阿里移动神经网络推理框架)和 HyperLPR3(中文车牌识别SDK)。以下是在树莓派5(aarch64 / Ubuntu 24.04)上的完整安装流程。
PlateRecApp
├── HyperLPR3 SDK → libhyperlpr3.so(车牌检测+识别)
│ └── MNN → libMNN.so(底层推理引擎)
├── OpenCV 4.x → 图像处理
├── FFmpeg → RTSP流解码(DRM硬解/H.264软解)
├── SQLite3 → 数据持久化
├── cURL + OpenSSL → API通信 / HTTPS
├── mosquitto → MQTT消息推送
├── FreeType2 → 中文字体渲染(水印)
├── cJSON → JSON解析
└── libcrypt → bcrypt密码哈希
# 更新系统
sudo apt update && sudo apt upgrade -y
# 编译工具链
sudo apt install -y build-essential cmake git wget pkg-config
# OpenCV 4.x
sudo apt install -y libopencv-dev libopencv-core-dev libopencv-imgproc-dev \
libopencv-imgcodecs-dev libopencv-highgui-dev libopencv-videoio-dev
# FFmpeg(RTSP视频流解码)
sudo apt install -y libavformat-dev libavcodec-dev libavutil-dev libswscale-dev
# SQLite3
sudo apt install -y libsqlite3-dev
# cURL + OpenSSL
sudo apt install -y libcurl4-openssl-dev libssl-dev
# FreeType2(中文字体渲染)
sudo apt install -y libfreetype-dev
# cJSON
sudo apt install -y libcjson-dev
# MQTT客户端
sudo apt install -y libmosquitto-dev libmosquittopp-dev
# Protobuf(MNN编译需要)
sudo apt install -y libprotobuf-dev protobuf-compiler
# libcrypt(bcrypt认证)
sudo apt install -y libcrypt-dev
MNN 是阿里巴巴开源的轻量级深度学习推理引擎,为 HyperLPR3 提供底层模型推理能力。
cd ~
git clone --depth=1 https://github.com/alibaba/MNN.git
cd MNN
# 生成 schema(首次编译必须执行)
./schema/generate.sh
# 创建构建目录
mkdir build && cd build
# CMake 配置(关键参数说明见下方表格)
cmake .. \
-DMNN_BUILD_CONVERTER=OFF \
-DMNN_SEP_BUILD=OFF \
-DMNN_ARM82=ON \
-DMNN_OPENMP=ON
# 编译(-j4 适配树莓派4核)
make -j4
# 安装到系统
sudo make install
sudo ldconfig
| 参数 | 值 | 说明 |
|---|---|---|
MNN_SEP_BUILD |
OFF |
关闭分离构建,生成单个 libMNN.so(推荐) |
MNN_ARM82 |
ON |
启用 ARMv8.2 半精度浮点(fp16)加速,树莓派5必开 |
MNN_OPENMP |
ON |
启用 OpenMP 多线程加速(默认开启) |
MNN_BUILD_CONVERTER |
OFF |
本项目不需要模型转换工具,关闭减小体积 |
MNN_OPENCL |
OFF |
GPU加速(树莓派无可用OpenCL,保持关闭) |
MNN_VULKAN |
OFF |
Vulkan加速(树莓派支持有限,建议关闭) |
# 检查库文件
ls /usr/local/lib/libMNN*
# 预期输出: libMNN.so (或 libMNN.a 如果静态编译)
# 检查头文件
ls /usr/local/include/MNN/
# 预期输出: Interpreter.hpp, MNNDefine.h, ...
HyperLPR3 是基于深度学习的中文车牌识别框架。本项目使用其 C++ SDK 动态库。
📌 官方仓库:https://github.com/HyperInspire/HyperLPR3
📌 国内镜像:https://gitee.com/zeusees/HyperLPR
HyperLPR3 官方提供多平台预编译SDK包,包含头文件、动态库和模型文件。
下载地址(官方百度网盘):
| 平台 | 说明 |
|---|---|
| Linux-x86_64 | x86_64 桌面/服务器 |
| Linux-aarch64 | 树莓派5 / ARM64 开发板(本项目使用) |
| Linux-armv7l | 32位ARM |
| macOS-x86 | Intel Mac |
下载后解压,目录结构应为:
hyperlpr3/ # 放置于 PlateRecApp 项目根目录
├── include/ # SDK 头文件
│ └── hyper_lpr_sdk.h # 核心API头文件
├── lib/ # 动态库
│ └── libhyperlpr3.so # 车牌识别SDK
└── resource/ # 模型文件 + 测试图片
└── models/ # 检测+识别模型(.mnn格式)
├── det/ # 车牌检测模型
├── rec/ # 车牌识别模型
└── ...
安装步骤:
# 1. 将SDK解压到项目根目录
cd /path/to/PlateRecApp
# 假设下载的SDK压缩包名为 hyperlpr3-linux-aarch64.zip
unzip hyperlpr3-linux-aarch64.zip -d .
# 2. 确认目录结构正确
ls hyperlpr3/include/hyper_lpr_sdk.h # 头文件
ls hyperlpr3/lib/libhyperlpr3.so # 动态库
ls hyperlpr3/resource/models/ # 模型文件
# 3. 设置运行时库搜索路径
echo "/path/to/PlateRecApp/hyperlpr3/lib" | sudo tee /etc/ld.so.conf.d/hyperlpr3.conf
sudo ldconfig
如果预编译SDK不可用,可自行编译。
# 1. 克隆源码
cd ~
git clone --depth=1 https://github.com/HyperInspire/HyperLPR3.git
cd HyperLPR3
# 2. 下载第三方依赖包(官方百度网盘,code: eu31)
# 解压后放置到项目根目录,或通过软链接引入
# 依赖包含预编译的 MNN 和 OpenCV 静态库
# 3. 编译动态库
sh command/build_release_linux_share.sh
# 4. 编译产物位于
# build/linux/install/hyperlpr3/
# ├── include/ 头文件
# ├── lib/ 动态库 (libhyperlpr3.so)
# └── resource/ 模型文件
# 5. 将产物拷贝到 PlateRecApp 项目目录
cp -r build/linux/install/hyperlpr3 /path/to/PlateRecApp/
HyperLPR3 需要以下模型文件(.mnn 格式,由 MNN 推理引擎加载):
| 模型 | 功能 | 位置 |
|---|---|---|
| 车牌检测模型 (det) | 定位图片中的车牌区域 | resource/models/det/ |
| 车牌识别模型 (rec) | 识别车牌字符 | resource/models/rec/ |
| 车牌分割模型 (seg) | 分割粘连车牌字符 | resource/models/seg/(可选) |
⚠️ 模型文件必须与可执行文件在同一路径或配置路径下,否则运行时会报模型加载失败。
安装完所有依赖后,执行以下检查:
cd /path/to/PlateRecApp
# 检查所有依赖是否就绪
echo "=== 依赖检查 ==="
echo -n "OpenCV: " && pkg-config --modversion opencv4 2>/dev/null || echo "❌ 未安装"
echo -n "SQLite3: " && pkg-config --modversion sqlite3 2>/dev/null || echo "❌ 未安装"
echo -n "cURL: " && curl --version | head -1 || echo "❌ 未安装"
echo -n "OpenSSL: " && openssl version || echo "❌ 未安装"
echo -n "FFmpeg: " && pkg-config --modversion libavformat 2>/dev/null || echo "❌ 未安装"
echo -n "FreeType2: " && pkg-config --modversion freetype2 2>/dev/null || echo "❌ 未安装"
echo -n "cJSON: " && pkg-config --modversion libcjson 2>/dev/null || echo "❌ 未安装"
echo -n "Mosquitto: " && dpkg -l | grep libmosquitto-dev | awk '{print $3}' || echo "❌ 未安装"
echo -n "MNN: " && ls /usr/local/lib/libMNN.so >/dev/null 2>&1 && echo "✅ 已安装" || echo "❌ 未安装"
echo -n "HyperLPR3: " && ls hyperlpr3/lib/libhyperlpr3.so >/dev/null 2>&1 && echo "✅ 已安装" || echo "❌ 未安装"
echo -n "HyperLPR3头文件: " && ls hyperlpr3/include/hyper_lpr_sdk.h >/dev/null 2>&1 && echo "✅ 存在" || echo "❌ 缺失"
echo -n "模型文件: " && ls hyperlpr3/resource/models/ >/dev/null 2>&1 && echo "✅ 存在" || echo "❌ 缺失"
cd /path/to/PlateRecApp
# 创建构建目录
mkdir -p build && cd build
# CMake 配置
cmake .. \
-DCMAKE_BUILD_TYPE=Release
# 编译(-j4 适配树莓派4核)
make -j4
# 编译产物
ls -la PlateRecApp
# 可执行文件约 2-5 MB(Release 模式 strip 后)
| 问题 | 原因 | 解决方案 |
|---|---|---|
fatal error: MNN/Interpreter.hpp: No such file |
MNN 头文件路径未配置 | sudo make install 后 sudo ldconfig |
undefined reference to hyperlpr3_xxx |
HyperLPR3 库未链接 | 确认 hyperlpr3/lib/libhyperlpr3.so 存在 |
libhyperlpr3.so: cannot open shared object |
运行时找不到动态库 | echo "路径" > /etc/ld.so.conf.d/hyperlpr3.conf && sudo ldconfig |
模型加载失败 |
模型文件路径不正确 | 确认 hyperlpr3/resource/models/ 目录存在且包含 .mnn 文件 |
OpenCV 版本不匹配 |
系统安装多版本 OpenCV | pkg-config --modversion opencv4 确认版本 ≥ 4.0 |
MNN ARM82 编译报错 |
汇编宏嵌套过深 | 参考 MNN Issue,手动展开 FMAX/FMIN 宏调用 |
cJSON 找不到 |
未安装或 pkg-config 缺失 | sudo apt install libcjson-dev |
mosquittopp 找不到 |
MQTT C++ 库未安装 | sudo apt install libmosquittopp-dev |
git clone https://git.zhonjin.com:40717/steven_roc/PlateRecApp.git
cd PlateRecApp
mkdir build && cd build
cmake ..
make -j4
# 复制配置模板并修改
cp config/config一号门.ini config.ini
# 编辑 config.ini 填入实际参数
sudo bash scripts/deploy.sh
sudo systemctl status PlateRecApp
# 访问 Web 管理: http://<设备IP>:8080
核心配置通过 config.ini 管理:
[rtsp]
# RTSP 视频流地址(支持4路)
URL_1 = rtsp://...
URL_2 = rtsp://...
[feishu]
ENABLED = 1 # 1=启用飞书消息推送,0=禁用
WEBHOOK_URL = https://open.feishu.cn/open-apis/bot/v2/hook/xxx
[MQTT]
MQTT_ENABLED = 1 # 1=启用MQTT消息推送,0=禁用
MQTT_HOST = xxx
MQTT_PORT = 1883
[weight]
flagWeight = 1 # 飞书消息是否携带重量信息 (1=是)
[web]
PORT = 8080 # Web 管理端口
| 功能 | 路径 | 说明 |
|---|---|---|
| 首页仪表盘 | / |
系统概览、最新抓拍 |
| 登录认证 | /login |
超级管理员/普通用户双角色 |
| 系统监控 | /monitor |
CPU/内存/磁盘/温度实时监控 |
| frpc 管理 | /frpc |
内网穿透服务管理 |
| SSH 密钥 | /ssh |
Web 端 SSH 密钥管理 |
| 日志管理 | /logs |
在线查看 + logrotate |
| ROI 调整 | /roi |
Web 端 4 路视频 ROI 手动调整 |
| 视频预览 | /video |
实时视频流预览 |
| 称重记录 | /weight |
称重数据查询 |
| 角色 | 用户名 | 密码 | 权限 |
|---|---|---|---|
| 超级管理员 | admin | zhonjin188A | 所有页面 |
| 普通用户 | zhonjin | zhonjin | 基础页面 |
首次部署后建议通过
scripts/reset_passwords.py修改默认密码
g_feishu_enabled) 控制| 版本 | 日期 | 主要内容 |
|---|---|---|
| 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管理 |
| fix24 v21 | 2026-07-03 | P0 时间对齐 bug 修复 |
| fix18 | 2026-07-06 | 重复抓拍竞态、4路视频流、MQTT合并 |
| V5 fix19 | 2026-06-25 | 基础版本 |
详细变更记录请查看 CHANGELOG.md
项目包含 sync_to_gogs.sh 脚本,每次代码更新后执行即可自动同步到 Gogs 仓库:
bash sync_to_gogs.sh
本项目为内部使用项目。