1. 项目概述
作为一名计算机专业的学生,毕业设计是检验四年学习成果的重要环节。我选择了"智能停车场管理系统"作为课题,这是一个结合了物联网、人工智能和软件开发的综合性项目。在导师的指导下,我花了三个月时间完成了从需求分析到系统设计的全过程。
这个系统最吸引我的地方在于它完美融合了硬件和软件。通过车牌识别摄像头、地感线圈等物联网设备采集数据,再经过后台系统的智能处理,最终实现停车场的自动化管理。相比传统的人工收费模式,这套系统可以提升至少50%的运营效率,同时减少人为错误。
2. 需求分析
2.1 功能需求
在项目开始前,我走访了学校周边的三个停车场,与管理员深入交流后发现他们最头疼的几个问题:
- 高峰期车辆排队时间长
- 人工收费容易出错
- 车位使用情况不透明
- 月卡管理混乱
基于这些痛点,我将系统功能划分为五大模块:
- 车辆进出管理:采用YOLOv5算法实现车牌识别,准确率达到98.7%
- 车位管理:通过地感线圈实时监测车位状态
- 计费系统:支持多种计费模式,包括:
- 临时车:首小时免费,之后每小时5元
- 月卡车:300元/月
- VIP车:免费停放
- 用户管理:RBAC权限控制模型
- 数据统计:自动生成运营报表
2.2 非功能需求
为了确保系统稳定性,我制定了严格的性能指标:
-
响应时间:
- 车牌识别:≤1秒
- 闸机响应:≤3秒
- 管理端页面加载:≤2秒
-
并发能力:支持500+车辆同时在线
-
可用性:全年可用率≥99.5%
-
数据安全:
- 采用SHA-256加密用户密码
- 每日凌晨3点自动备份数据库
3. 系统设计
3.1 技术选型
经过多方比较,最终确定的技术栈如下:
| 技术层面 | 选型方案 | 优势分析 |
|---|---|---|
| 后端开发 | Spring Boot 2.7 + MyBatis | 快速开发,生态完善 |
| 前端开发 | Vue3 + Element Plus | 组件丰富,易于维护 |
| 数据库 | MySQL 8.0 | ACID特性,性能稳定 |
| 缓存 | Redis 6.2 | 高频数据缓存 |
| 部署 | Docker + Nginx | 环境隔离,负载均衡 |
特别要说明的是车牌识别方案的选择。对比了OpenCV、Tesseract和深度学习方案后,最终选用YOLOv5+CRNN的组合,在测试集上取得了98.7%的识别准确率。
3.2 架构设计
系统采用经典的四层架构:
- 表现层:Vue3构建的管理后台
- 业务层:Spring Boot实现核心逻辑
- 数据层:MySQL+Redis数据存储
- 设备层:通过MQTT协议与硬件通信
这种分层设计使得系统各模块耦合度低,后期维护和扩展都很方便。比如要更换车牌识别算法,只需要修改业务层的识别服务即可。
3.3 数据库设计
核心表结构设计如下:
- 车辆记录表(parking_record)
sql复制CREATE TABLE `parking_record` (
`id` bigint NOT NULL AUTO_INCREMENT,
`plate_number` varchar(20) NOT NULL,
`entry_time` datetime NOT NULL,
`exit_time` datetime DEFAULT NULL,
`parking_duration` int DEFAULT NULL,
`total_fee` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_plate_number` (`plate_number`),
INDEX `idx_entry_time` (`entry_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 车位信息表(parking_space)
sql复制CREATE TABLE `parking_space` (
`id` bigint NOT NULL AUTO_INCREMENT,
`space_code` varchar(20) NOT NULL,
`status` tinyint NOT NULL DEFAULT '0',
`area` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_space_code` (`space_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
索引设计特别注意了查询性能,在车牌号和入场时间字段都建立了索引,确保高峰期也能快速查询。
4. 核心功能实现
4.1 车牌识别模块
车牌识别流程如下:
- 图像采集:摄像头抓拍车辆前脸
- 预处理:灰度化+二值化
- 车牌定位:YOLOv5模型
- 字符分割:垂直投影法
- 字符识别:CRNN模型
关键代码片段:
python复制# 车牌识别核心代码
def recognize_plate(image):
# 1. 使用YOLOv5定位车牌
results = yolov5_model(image)
plate_box = results.xyxy[0][0] # 获取车牌位置
# 2. 裁剪车牌区域
plate_img = image[plate_box[1]:plate_box[3], plate_box[0]:plate_box[2]]
# 3. 字符分割与识别
gray = cv2.cvtColor(plate_img, cv2.COLOR_BGR2GRAY)
binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
# 4. 使用CRNN识别字符
plate_number = crnn_model.predict(binary)
return plate_number
4.2 计费模块
计费规则配置灵活,支持多种计费方式:
- 按时计费:
java复制public BigDecimal calculateByTime(ParkingRecord record) {
long minutes = Duration.between(record.getEntryTime(),
LocalDateTime.now()).toMinutes();
if(minutes <= 60) {
return BigDecimal.ZERO; // 首小时免费
}
BigDecimal fee = rate.multiply(
BigDecimal.valueOf((minutes - 60 + 59) / 60)); // 向上取整
return fee.min(maxFee); // 不超过最高费用
}
- 包月计费:
java复制public boolean checkMonthlyCardValid(User user) {
return user.getCardStatus() == 1 &&
user.getCardEndTime().isAfter(LocalDate.now());
}
5. 测试与优化
5.1 性能测试
使用JMeter进行压力测试,结果如下:
| 并发用户数 | 平均响应时间 | 错误率 |
|---|---|---|
| 100 | 1.2s | 0% |
| 300 | 1.8s | 0% |
| 500 | 2.3s | 0.5% |
发现当并发达到500时,数据库连接出现瓶颈。通过增加连接池大小和添加Redis缓存,最终将500并发下的错误率降到了0.1%。
5.2 识别率优化
初始版本的车牌识别在夜间和雨天准确率下降明显。通过以下措施进行优化:
- 增加图像增强模块
- 收集更多不同天气条件下的训练数据
- 加入超分辨率重建
优化后各场景识别率对比:
| 场景 | 优化前 | 优化后 |
|---|---|---|
| 晴天白天 | 99% | 99.5% |
| 夜间 | 85% | 95% |
| 雨天 | 78% | 92% |
6. 部署方案
根据停车场规模提供两种部署方式:
-
小型停车场方案:
- 硬件:1台工控机(Intel i5, 8GB RAM)
- 软件:Docker容器部署所有服务
- 成本:约1.5万元
-
大型停车场方案:
- 硬件:
- 应用服务器×2(负载均衡)
- 数据库服务器×1(主从复制)
- Redis缓存服务器×1
- 软件:Kubernetes集群管理
- 成本:约8万元
- 硬件:
7. 项目心得
通过这个项目,我深刻体会到几个重要的经验:
-
需求分析要深入实际:最初设计的预约功能在实际调研中发现使用率很低,及时调整了优先级。
-
性能优化要有的放矢:通过APM工具定位到数据库查询是性能瓶颈,针对性优化后效果显著。
-
异常处理要周全:特别是硬件设备通信,必须考虑断网、断电等各种异常情况。
-
文档要及时更新:设计文档要随着代码迭代同步更新,这点我做得不够好,后期吃了亏。
这个项目让我将课堂上学到的理论知识真正应用到了实践中,特别是对分布式系统和性能优化有了更深的理解。虽然还有很多可以改进的地方,但看到系统在实际环境中稳定运行,这种成就感是无可替代的。