技术文档_车辆智能监测系统
·
车辆智能监测系统 - 技术文档
1. 系统概述
1.1 项目背景
本系统是一套基于海康威视SDK和RKNN模型的车辆智能监测系统,主要用于车辆年检场景中的黑烟检测和车牌识别。
1.2 核心功能
| 功能模块 | 说明 | 状态 |
|---|---|---|
| 车牌识别 | 通过海康SDK接收车牌抓拍报警 | ✅ 已实现 |
| 黑烟检测 | 使用RKNN模型进行实时黑烟检测 | ✅ 已实现 |
| 预警记录 | 检测到黑烟时保存预警信息和图片 | ✅ 已实现 |
| 配置管理 | Web前端配置摄像头参数和检测阈值 | ✅ 已实现 |
| 检测区域框选 | 支持自定义黑烟检测区域 | ✅ 已实现 |
2. 技术架构
2.1 系统架构图
┌─────────────────────────────────────────────────────────────────┐
│ 前端页面 (HTML/JS) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ 摄像头配置 │ │ 检测参数配置 │ │ 预警记录展示 │ │
│ └──────┬───────┘ └──────┬───────┘ └────────┬─────────┘ │
└──────────┼─────────────────┼───────────────────┼───────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ FastAPI 后端服务 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ /config │ │ /start │ │ /alerts │ │
│ │ /set_roi │ │ /stop │ │ /plate │ │
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
└──────────┬─────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 核心业务模块 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ 海康SDK │ │ RKNN检测器 │ │ 视频流处理 │ │
│ │ 车牌识别 │ │ 黑烟检测 │ │ 帧读取/分析 │ │
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
2.2 核心模块说明
2.2.1 海康SDK模块
- 功能:通过SDK连接摄像头,接收车牌识别报警信息
- 关键API:
NET_DVR_Init()- 初始化SDKNET_DVR_Login_V40()- 设备登录NET_DVR_SetDVRMessageCallBack_V30()- 设置回调函数NET_DVR_StartListen_V30()- 启动监听
2.2.2 RKNN黑烟检测器
- 功能:使用RKNN模型进行实时黑烟检测
- 关键流程:
- 模型初始化 (
SmokeDetector.init()) - 图像预处理 (
preprocess()) - 模型推理 (
rknn.inference()) - 后处理与NMS (
postprocess())
- 模型初始化 (
2.2.3 视频流处理
- 功能:读取RTSP流,每秒处理一帧
- 优化策略:
- 设置缓冲大小为1帧
- 固定帧率为1fps
- 分辨率设置为640×480
3. 配置说明
3.1 默认配置
# 摄像头配置
cam1_ip = "xxx" # 车牌识别摄像头
cam2_ip = "XXX" # 黑烟检测摄像头
cam1_username = "admin"
cam1_password = "qXXX"
cam2_username = "admin"
cam2_password = "XXX"
# 检测参数
smoke_confidence = 0.1 # 黑烟检测置信度阈值
model_name = "smoke_0520.rknn" # RKNN模型文件名
# 检测区域(默认:画面中下部分,占宽度80%,高度40%)
roi_x1 = 64
roi_y1 = 192
roi_x2 = 576
roi_y2 = 384
3.2 配置文件管理
配置文件路径:camera_config.json
{
"cam1_ip": "192.168.40.210",
"cam1_username": "admin",
"cam1_password": "qaz135$+",
"cam2_ip": "192.168.40.211",
"cam2_username": "admin",
"cam2_password": "qaz135$+",
"smoke_confidence": 0.1,
"model_name": "smoke_0520.rknn",
"roi_x1": 64,
"roi_y1": 192,
"roi_x2": 576,
"roi_y2": 384
}
4. 常见问题与解决方案
4.1 SDK加载失败
问题描述:
OSError: cannot open shared object file: No such file or directory
原因分析:
- LD_LIBRARY_PATH环境变量未正确设置
- SDK文件路径配置错误
- 缺少HCNetSDKCom目录
解决方案:
# 设置环境变量(Linux)
export LD_LIBRARY_PATH=/path/to/HCNetSDKV6.1.11.5:/path/to/HCNetSDKV6.1.11.5/HCNetSDKCom:$LD_LIBRARY_PATH
代码层面处理:
if sys.platform.startswith('linux'):
sdk_path = "./HCNetSDKV6.1.11.5_build20251204_ArmLinux64_ZH_20260320152158"
sdk_com_path = os.path.join(sdk_path, 'HCNetSDKCom')
current_ld_path = os.environ.get('LD_LIBRARY_PATH', '')
new_ld_path = sdk_path + ':' + sdk_com_path + ':' + current_ld_path
os.environ['LD_LIBRARY_PATH'] = new_ld_path
4.2 登录异常
问题描述:
'int' object is not subscriptable
原因分析:
- SDK登录函数返回值处理不当
- 结构体初始化不完整
解决方案:
# 正确初始化登录结构体
login_info = NET_DVR_USER_LOGIN_INFO()
ctypes.memset(ctypes.byref(login_info), 0, ctypes.sizeof(login_info))
login_info.sDeviceAddress = c_char_p(ip.encode('gbk'))
login_info.sUserName = c_char_p(username.encode('gbk'))
login_info.sPassword = c_char_p(password.encode('gbk'))
login_info.wPort = port
# 正确处理返回值
lUserID = HCNetSDK.NET_DVR_Login_V40(ctypes.byref(login_info), ctypes.byref(device_info))
if lUserID < 0:
error_code = HCNetSDK.NET_DVR_GetLastError()
print(f"登录失败,错误码: {error_code}")
4.3 视频卡顿
问题描述:
- 实时画面显示卡顿
- 检测处理延迟严重
原因分析:
- RTSP缓冲过大
- 帧率设置过高
- 分辨率过高
- 画面显示占用资源
解决方案:
# 优化RTSP连接配置
cap = cv2.VideoCapture(rtsp_url)
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) # 设置缓冲为1帧
cap.set(cv2.CAP_PROP_FPS, 1) # 设置帧率为1fps
# 生产环境禁用画面显示
parser.add_argument('--no-display', action='store_true', help='禁用画面显示')
优化效果:
| 优化项 | 优化前 | 优化后 | 效果 |
|---|---|---|---|
| 缓冲大小 | 默认 | 1帧 | 减少延迟 |
| 帧率 | 原始 | 1fps | 降低CPU占用 |
| 画面显示 | 启用 | 可选禁用 | 减少内存占用 |
4.4 置信度设置问题
问题描述:
- 设置置信度为0.05仍无预警
- 设置置信度为0.05出现大量误检
原因分析:
- 置信度阈值设置过低导致误检
- 模型后处理NMS阈值不合适
解决方案:
| 场景 | 推荐置信度 | 说明 |
|---|---|---|
| 严格检测 | 0.3-0.5 | 减少误检,可能漏检 |
| 平衡模式 | 0.15-0.25 | 兼顾检测率和准确率 |
| 宽松检测 | 0.05-0.1 | 检测率高,误检较多 |
代码配置:
CONF_THRESH = 0.13 # 黑烟检测置信度
NMS_THRESH = 0.45 # NMS非极大值抑制阈值
4.5 模型文件路径问题
问题描述:
模型文件不存在:best_0513.rknn
原因分析:
- 模型文件未放置在正确路径
- 配置中的模型名称与实际文件名不一致
- 配置文件未正确保存
解决方案:
- 确保模型文件存在:
ls -la *.rknn
# 确保输出中包含你要使用的模型文件
- 正确操作流程:
前端输入模型名称 → 点击"保存配置" → 点击"启动系统"
- 检查配置保存:
# 后端会打印配置更新日志
print(f"[配置更新] 模型名称已更新为: {current_config['model_name']}")
# 启动时检查模型文件
model_path = os.path.join(os.getcwd(), model_name)
if os.path.exists(model_path):
print(f"✅ 模型文件存在: {model_path}")
else:
print(f"⚠️ 警告:模型文件不存在: {model_path}")
4.6 预警记录前端显示问题
问题描述:
- 终端显示预警已保存
- 前端页面未显示预警记录
原因分析:
- 预警回调条件限制(仅在有车牌时记录)
- 前端轮询接口异常
- 数据格式不匹配
解决方案:
# 修改预警回调逻辑,无车牌也记录
if alert_callback:
plate_num = plate_snap["plate_num"] if plate_snap["plate_num"] else "无车牌"
alert_callback(plate_num, time.strftime("%Y-%m-%d %H:%M:%S"))
前端轮询逻辑:
// 每2秒轮询一次预警记录
setInterval(async () => {
try {
const response = await fetch('/alerts');
const data = await response.json();
const alertList = document.getElementById('alert-list');
if (data.length > 0) {
alertList.innerHTML = data.map(alert => `
<div class="alert-item">
<span class="plate">[预警] ${alert.plate}</span>
<span class="time">${alert.time}</span>
</div>
`).join('');
} else {
alertList.innerHTML = '<div style="text-align:center; color:#999;">暂无预警记录</div>';
}
} catch (error) {
console.error('获取预警失败:', error);
}
}, 2000);
4.7 检测框位置不正确
问题描述:
- 配置的检测区域与实际画面不匹配
- 检测框位置偏移
原因分析:
- 摄像头分辨率与默认分辨率不一致
- 坐标未进行缩放处理
解决方案:
# 获取实际帧分辨率
actual_height, actual_width = frame2.shape[:2]
# 默认分辨率(前端设置的基准分辨率)
default_width = 640
default_height = 480
# 计算缩放比例
scale_x = actual_width / default_width
scale_y = actual_height / default_height
# 将ROI坐标缩放到实际分辨率
x1_roi_scaled = int(x1_roi * scale_x)
y1_roi_scaled = int(y1_roi * scale_y)
x2_roi_scaled = int(x2_roi * scale_x)
y2_roi_scaled = int(y2_roi * scale_y)
# 确保坐标在有效范围内
x1_roi_scaled = max(0, x1_roi_scaled)
y1_roi_scaled = max(0, y1_roi_scaled)
x2_roi_scaled = min(actual_width - 1, x2_roi_scaled)
y2_roi_scaled = min(actual_height - 1, y2_roi_scaled)
5. API接口说明
5.1 配置管理
| 接口 | 方法 | 说明 |
|---|---|---|
/config |
GET | 获取当前配置 |
/config |
POST | 更新配置 |
POST /config 请求体:
{
"cam1_ip": "192.168.40.210",
"cam1_username": "admin",
"cam1_password": "qaz135$+",
"cam2_ip": "192.168.40.211",
"cam2_username": "admin",
"cam2_password": "qaz135$+",
"smoke_confidence": 0.1,
"model_name": "smoke_0520.rknn"
}
5.2 系统控制
| 接口 | 方法 | 说明 |
|---|---|---|
/start |
POST | 启动系统 |
/stop |
POST | 停止系统 |
/status |
GET | 获取系统状态 |
5.3 数据查询
| 接口 | 方法 | 说明 |
|---|---|---|
/plate |
GET | 获取最新车牌信息 |
/alerts |
GET | 获取预警记录列表 |
/set_roi |
POST | 设置检测区域 |
POST /set_roi 请求体:
{
"x1": 64,
"y1": 192,
"x2": 576,
"y2": 384
}
6. 部署说明
6.1 环境要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Linux (RK3588) |
| Python版本 | 3.8+ |
| 依赖库 | opencv-python, rknn-toolkit2, fastapi, uvicorn |
| SDK版本 | HCNetSDKV6.1.11.5 (ARM Linux) |
6.2 依赖安装
# 安装基础依赖
pip install opencv-python numpy requests
# 安装FastAPI
pip install fastapi uvicorn
# 安装RKNN Toolkit(根据平台选择)
# RK3588平台
pip install rknn-toolkit2
6.3 启动命令
# 开发模式
python app.py
# 生产模式(禁用调试)
uvicorn app:app --host 0.0.0.0 --port 8000 --workers 1
6.4 项目结构
./
├── app.py # FastAPI主应用
├── vehicle_inspection_sdk.py # 核心业务逻辑
├── camera_config.json # 配置文件(运行后生成)
├── HCNetSDKV6.1.11.5_.../ # 海康SDK目录
│ ├── libhcnetsdk.so
│ └── HCNetSDKCom/
├── templates/
│ └── index.html # 前端页面
├── alerts/ # 预警图片保存目录
└── smoke_0520.rknn # RKNN模型文件
7. 日志说明
7.1 日志级别
| 级别 | 标识 | 说明 |
|---|---|---|
| 信息 | [I] | 正常运行信息 |
| 警告 | [W] | 需要注意的情况 |
| 错误 | [E] | 错误信息 |
| 调试 | [DEBUG] | 详细调试信息 |
7.2 关键日志示例
[I] SDK初始化成功
[I] 登录设备 192.168.40.210 成功
[I] 已连接 1 个摄像头用于车牌抓拍
[I] 当前配置的模型名称: smoke_0520.rknn
[I] ✅ 模型文件存在: /path/to/smoke_0520.rknn
[I] 系统启动成功(无显示模式)!黑烟置信度: 0.13
[黑烟检测] 检测区域内发现 2 个目标, 置信度: [0.85, 0.72]
[I] ✅ 预警已保存: alerts/smoke_京A12345_20260520_112236.jpg
8. 故障排查流程
┌─────────────────────────────────────────────────────────────────┐
│ 故障排查流程图 │
├─────────────────────────────────────────────────────────────────┤
│ 问题现象 │
│ │ │
│ ▼ │
│ 检查日志 │
│ │ │
│ ├── [E] 模型文件不存在 → 检查模型文件路径和名称 │
│ │ │
│ ├── [E] SDK加载失败 → 检查LD_LIBRARY_PATH │
│ │ │
│ ├── [E] 登录失败 → 检查摄像头IP/用户名/密码 │
│ │ │
│ └── [W] 黑烟检测器初始化失败 → 检查RKNN环境 │
│ │
│ 检查网络连接 │
│ │ │
│ ├── ping 摄像头IP → 网络连通性 │
│ └── 检查RTSP端口(554) → 端口是否开放 │
│ │
│ 检查配置文件 │
│ │ │
│ └── camera_config.json 是否存在且内容正确 │
│ │
│ 检查资源占用 │
│ │ │
│ ├── CPU占用 → top命令 │
│ └── 内存占用 → free命令 │
└─────────────────────────────────────────────────────────────────┘
9. 版本历史
| 版本 | 日期 | 变更说明 |
|---|---|---|
| V1.0 | 2026-05-10 | 初始版本,基础功能实现 |
| V1.1 | 2026-05-15 | 添加SDK支持,优化视频流处理 |
| V1.2 | 2026-05-20 | 添加检测区域框选,修复预警显示问题 |
文档版本:V1.0
创建日期:2026-05-21
适用系统:车辆智能监测系统
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)