车辆智能监测系统 - 技术文档

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() - 初始化SDK
    • NET_DVR_Login_V40() - 设备登录
    • NET_DVR_SetDVRMessageCallBack_V30() - 设置回调函数
    • NET_DVR_StartListen_V30() - 启动监听
2.2.2 RKNN黑烟检测器
  • 功能:使用RKNN模型进行实时黑烟检测
  • 关键流程
    1. 模型初始化 (SmokeDetector.init())
    2. 图像预处理 (preprocess())
    3. 模型推理 (rknn.inference())
    4. 后处理与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

原因分析

  • 模型文件未放置在正确路径
  • 配置中的模型名称与实际文件名不一致
  • 配置文件未正确保存

解决方案

  1. 确保模型文件存在
ls -la *.rknn
# 确保输出中包含你要使用的模型文件
  1. 正确操作流程
前端输入模型名称 → 点击"保存配置" → 点击"启动系统"
  1. 检查配置保存
# 后端会打印配置更新日志
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
适用系统:车辆智能监测系统

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐