1. 项目概述
作为一名计算机专业的学生,毕业设计是检验四年学习成果的重要环节。我选择了"基于Python的智能停车场管理系统"作为我的毕业设计课题,这是一个结合了Web开发和大数据技术的综合性项目。随着城市车辆保有量不断增加,传统停车场管理方式已无法满足现代需求,特别是在车牌识别环节存在效率低、准确性差等问题。本项目旨在利用Django框架和Python技术栈,开发一套成本适中、易于部署的智能停车场管理系统,为中小型停车场提供高效的车牌识别解决方案。
提示:选择毕业设计课题时,建议优先考虑与自己未来职业方向相关的技术栈,这样既能巩固所学知识,又能为求职积累项目经验。
2. 系统设计与技术选型
2.1 系统架构设计
本系统采用B/S(Browser/Server)架构,分为前端展示层、业务逻辑层和数据存储层三层结构:
- 前端展示层:基于Vue.js框架开发,负责用户界面展示和交互
- 业务逻辑层:使用Django框架实现,处理核心业务逻辑
- 数据存储层:采用MySQL数据库存储系统数据
这种分层架构的优势在于:
- 前后端分离,便于团队协作和独立开发
- 系统可扩展性强,各层可以独立升级
- 部署维护简单,只需维护服务器端代码
2.2 技术栈选择
2.2.1 Django框架
选择Django作为后端框架主要基于以下考虑:
- 全栈式框架:内置ORM、模板引擎、表单处理等功能,开发效率高
- 自动化管理界面:自动生成后台管理界面,减少开发工作量
- 安全性:内置CSRF防护、XSS防御等安全机制
- 社区支持:拥有活跃的开发者社区,问题解决资源丰富
2.2.2 MySQL数据库
选用MySQL数据库的原因:
- 开源免费:适合学生项目和小型商业应用
- 性能稳定:能够满足中小型停车场的数据存储需求
- 易用性:安装配置简单,学习曲线平缓
- 与Django兼容性好:Django官方支持MySQL,集成方便
2.2.3 Vue.js前端框架
前端选择Vue.js的考虑因素:
- 渐进式框架:可以逐步采用,适合项目初期
- 组件化开发:提高代码复用性和可维护性
- 响应式设计:数据驱动视图,开发体验好
- 轻量高效:体积小,性能优秀
3. 核心功能实现
3.1 车牌识别模块
车牌识别是本系统的核心功能,实现流程如下:
- 图像采集:通过摄像头获取车辆入场/出场图像
- 预处理:
- 灰度化:将彩色图像转换为灰度图像
- 滤波去噪:使用高斯滤波消除图像噪声
- 边缘检测:采用Canny算法检测图像边缘
- 车牌定位:
- 基于颜色特征定位候选区域
- 使用形态学操作筛选车牌区域
- 字符分割:
- 二值化处理
- 投影法分割单个字符
- 字符识别:
- 使用预训练的OCR模型识别字符
- 输出识别结果
注意事项:在实际部署时,需要考虑不同光照条件对识别效果的影响,建议在停车场安装补光设备确保图像质量。
3.2 数据库设计
系统主要包含以下几张核心表:
3.2.1 车辆信息表(vehicle_info)
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | BIGINT | 主键 | PRIMARY KEY |
| plate_number | VARCHAR(20) | 车牌号 | NOT NULL |
| vehicle_type | VARCHAR(10) | 车辆类型 | |
| entry_time | DATETIME | 入场时间 | |
| exit_time | DATETIME | 出场时间 | |
| parking_duration | INT | 停车时长(分钟) | |
| fee | DECIMAL(10,2) | 停车费用 |
3.2.2 用户表(users)
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | BIGINT | 主键 | PRIMARY KEY |
| username | VARCHAR(50) | 用户名 | NOT NULL, UNIQUE |
| password | VARCHAR(100) | 密码(加密存储) | NOT NULL |
| role | VARCHAR(20) | 角色(admin/user) | NOT NULL |
| phone | VARCHAR(20) | 联系电话 | |
| VARCHAR(100) | 电子邮箱 |
3.2.3 停车记录表(parking_record)
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | BIGINT | 主键 | PRIMARY KEY |
| vehicle_id | BIGINT | 车辆ID | FOREIGN KEY |
| space_id | BIGINT | 车位ID | FOREIGN KEY |
| entry_image | VARCHAR(255) | 入场图像路径 | |
| exit_image | VARCHAR(255) | 出场图像路径 | |
| status | TINYINT | 状态(0-在场,1-已离场) | DEFAULT 0 |
4. 系统实现细节
4.1 开发环境搭建
4.1.1 Python环境配置
推荐使用Anaconda创建虚拟环境:
bash复制conda create -n parking python=3.8
conda activate parking
pip install django==3.2
pip install mysqlclient
pip install opencv-python
4.1.2 MySQL安装配置
- 下载安装MySQL Community Server
- 创建数据库和用户:
sql复制CREATE DATABASE parking_system CHARACTER SET utf8mb4;
CREATE USER 'parking_admin'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON parking_system.* TO 'parking_admin'@'localhost';
FLUSH PRIVILEGES;
4.1.3 Django项目初始化
bash复制django-admin startproject parking_system
cd parking_system
python manage.py startapp parking
4.2 核心代码实现
4.2.1 车牌识别视图
python复制import cv2
import numpy as np
from django.http import JsonResponse
def license_plate_recognition(request):
if request.method == 'POST' and request.FILES.get('image'):
# 读取上传的图像
image_file = request.FILES['image']
image = cv2.imdecode(np.fromstring(image_file.read(), np.uint8), cv2.IMREAD_COLOR)
# 图像预处理
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(blurred, 50, 200)
# 车牌定位(简化版,实际项目需更复杂的算法)
contours, _ = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]
plate = None
for contour in contours:
perimeter = cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, 0.02 * perimeter, True)
if len(approx) == 4: # 车牌通常是矩形
plate = approx
break
if plate is not None:
# 车牌识别逻辑(简化)
return JsonResponse({'status': 'success', 'plate_number': '识别结果'})
return JsonResponse({'status': 'error', 'message': '未检测到车牌'})
4.2.2 停车计费模型
python复制from django.db import models
from django.utils import timezone
class ParkingRecord(models.Model):
vehicle = models.ForeignKey('Vehicle', on_delete=models.CASCADE)
space = models.ForeignKey('ParkingSpace', on_delete=models.CASCADE)
entry_time = models.DateTimeField(auto_now_add=True)
exit_time = models.DateTimeField(null=True, blank=True)
fee = models.DecimalField(max_digits=10, decimal_places=2, default=0)
@property
def duration(self):
if self.exit_time:
return (self.exit_time - self.entry_time).total_seconds() / 60
return (timezone.now() - self.entry_time).total_seconds() / 60
def calculate_fee(self):
# 简单计费规则:首小时5元,之后每小时2元
duration_hours = max(1, self.duration / 60)
self.fee = 5 + max(0, (duration_hours - 1)) * 2
return self.fee
5. 系统部署与测试
5.1 部署方案
5.1.1 硬件要求
- 服务器:4核CPU,8GB内存,100GB存储
- 摄像头:200万像素以上,支持RTSP协议
- 网络:稳定有线网络连接
5.1.2 软件部署
- 安装依赖:
bash复制pip install -r requirements.txt
- 数据库迁移:
bash复制python manage.py makemigrations
python manage.py migrate
- 创建管理员账户:
bash复制python manage.py createsuperuser
- 启动开发服务器:
bash复制python manage.py runserver 0.0.0.0:8000
5.2 测试方案
5.2.1 功能测试
| 测试项 | 测试方法 | 预期结果 |
|---|---|---|
| 车牌识别 | 上传不同光照条件下的车辆图片 | 能正确识别车牌号码 |
| 停车计费 | 模拟不同停车时长 | 费用计算准确 |
| 用户权限 | 使用不同角色账户登录 | 权限控制正确 |
5.2.2 性能测试
使用JMeter进行压力测试:
- 模拟100用户并发访问
- 车牌识别API响应时间<3秒
- 系统资源占用率<70%
6. 项目总结与改进方向
6.1 项目成果
通过本次毕业设计,我实现了以下目标:
- 掌握了Django全栈开发流程
- 深入理解了车牌识别算法原理
- 完成了从需求分析到系统部署的完整项目周期
- 提升了解决实际问题的能力
6.2 改进方向
- 算法优化:引入深度学习模型提高车牌识别准确率
- 功能扩展:添加车位引导、在线支付等功能
- 性能提升:使用Redis缓存高频访问数据
- 移动端适配:开发微信小程序或APP版本
在实际开发过程中,我发现车牌识别在不同光照条件下的稳定性是需要重点解决的问题。后续可以考虑引入更先进的图像增强算法,或者使用预训练的深度学习模型来提高识别率。