智能停车场[简易版]
项目简介
项目来源于大四上的物联网设计实验课程,是智能交通大项目的一部分,该项目主要完成的功能是识别车牌号进行收费和统计空闲停车位进行发布。由于实验室设备简陋以及项目实现时间较短,项目代码简化为控制一个摄像头以及实现一个停车位的监控。
开发环境
硬件 树莓派、PC、摄像头、红外传感器
编程语言 Python/PHP/H5
开发环境 Raspbian/win10
功能简介
停车场收费管理
该项目使用一个直接与PC机相连的摄像头连续抓拍,识别车辆车牌,将识别到的车牌号以及进入停车场的时间或者离开停车场的时间存入数据库,倘若是离开停车场,则还需计算停车总时长以及需缴费用,也存入数据库。
停车场停车位管理
停车位通过红外传感器进行监控,与树莓派连续通信是否检测到障碍物,树莓派通过socket将数据传送至PC,PC决策是否有车辆停入该停车位,将停车位空闲情况存入数据库。
网页端
网页端只依赖数据库,网页端主要完成用户登录、车位管理、缴费信息三个功能。
此界面为用户登录界面,用户需在此界面登录后方可查看缴费信息,若是管理员登录,可查看所有车辆的缴费信息。
此界面为缴费信息界面,显示登录用户的车牌号、进场时间、出场时间、停车时长以及需缴费用。
此界面为车位管理界面,显示停车场的停车位空闲情况,无论用户是否登录,都可以在此界面进行停车位空闲情况的查看。
功能实现
项目所有代码已放入github,下面介简单记录几个我认为有用的部分。
Socket通信
Python中的socket模块封装了TCP/IP的内部细节。代码实现了在PC(服务器端)和树莓派(客户端)连续传输"0"或"1"。
下面是服务器端
#socket通信
import socket
host_ip = "192.168.137.1" #服务器地址
host_port = 8001 #服务器端口
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((host_ip, host_port))
print("listening......")
sock.listen(5)
connection, adress = sock.accept()
a = connection.recv(1) #a为传过来的数组
下面是客户端
import socket
import time
import RPi.GPIO as gpio
Host = "192.168.137.1"
Port = 8001
print("connecting......")
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((Host, Port))
gpio.setmode((gpio.BCM))
gpio.setup(6, gpio.IN)
while 1:
data = gpio.input(6)
if data == 0:
data_p = '0'
else:
data_p = '1'
sock.send((data_p).encode("utf-8"))
time.sleep(1)
sock.close()
print("closed")
gpio与树莓派的输入输出有关,因为树莓派与红外传感器通过gpio通信。
数据库相关知识
在该项目中的数据库知识分为三类,一类是本地数据操作,一类是与Python相依赖的数据库的操作,一类是与web开发相关的数据库操作。本地数据库的操作主要负责创建数据库、创建表,使用的是mysql;与Python相依赖的数据库操作主要实现项目中实际数据的写入,使用的是pymysql;与web开发相关的数据库操作主要实现数据库数据的提取便于在网页端发布用户需要的信息。下面我将记录简单的可以完成该项目的数据库操作。
本地数据库操作
首先是本地数据库操作,这个操作通常需要管理员模式打开cmd,当然前提是你需要下载安装mysql。
登录mysql
mysql -u root -p
"-u"后面接登录用户,之后会要求输入密码
如上图所示表示登录成功,之后创建数据库。
create database parking_system;
在mysql中不区分大小写,且以分号作为单个语句的结束,一定要注意。
若想查看当前有多少个数据库,则
show databases;
进入某个数据库才可以创建表
use parking_system;
对表进行创建
create table table_parking_toll(
car_id varchar(20),
in_time datetime,
out_time datetime,
park_time int(11)
toll int(11)
);
查看某数据库的表
show tables;
详细描述某一个表
describe table_parking_toll;
删除表
drop table table_parking_toll;
删除数据库
drop databse parking_system;
退出登录
exit
pymysql数据操作
在Python中使用数据时,需要安装pymysql包进行引用,然后进行连接,再执行增删查改。
import pymysql
#数据库连接登录
db = pymysql.connect(host = 'localhost', user = 'root', password = 'yangx', database = 'parking_system', port = 3306)
cursor = db.cursor() #获取游标
#增
sql = """insert into table_parking_toll(id, in_time) values ('%s', '%s')"""%(str_text, cur_time)
try:
cursor.execute(sql) #执行
db.commit() #提交
except:
db.rollback() #提交失败回退
#查
sql = """select * from table_parking_toll where id = '%s'"""%(str_text)
if(cursor.execute(sql)): #查询到记录
result = cursor.fetchall() #获取记录
db.commit()
#改
sql = """update table_parking_toll set out_time = '%s' where id = '%s'"""%(cur_time, str_text)
cursor.execute(sql)
db.commit()
#关闭数据库
db.close()
web开发中的数据库操作
该项目的web开发使用的是PHP和H5,数据库使用PHP进行操作,主要是查询操作。
$con = mysqli_connect('localhost','root','yangx');
if (!$con)
{
die('Could not connect: ' . mysqli_error($con));
}
// 选择数据库
mysqli_select_db($con,"parking_system");
// 查询
$sql="SELECT * FROM table_parking_toll WHERE id = {$pl}";
$result = mysqli_query($con,$sql);
// 逐条显示记录
while($row = mysqli_fetch_array($result))
{
echo $row['id'] . "<br/>";
}
代码介绍
在该项目中代码主要分为3个部分。一个是PC端代码,PC端代码又分为整个系统的运行代码以及tensorflow神经网络的训练代码;一个是web服务器代码,使用apache服务器,使用PHP嵌入H5中,H5为网页界面开发代码;一个是树莓派端socket通信的客户端代码。
下面是PC端字符识别部分的流程图
改进
完成这个项目的时间较短,项目还处于简易阶段,可以改进的地方挺多的。单从代码本身来说,可调参数的值可能影响最终效果;神经网络搭建不够好加上摄像头图片抓拍的模糊性使得识别效果不完美,因此可以改进神经网络的搭建,并且在识别之前可通过算法排除模糊的不清晰的照片;web端需要完善用户注册和登录的功能;对于车牌的定位也过于简单,仅仅靠颜色提取并不适用于停车场实际情况,也可以通过神经网络训练来进行改进;无法对多次识别到同一车辆进行有效处理。从设计来看,摄像头一直处于连续抓拍状态是对资源的浪费,可以在摄像头附近放置红外摄像头来监控是否有车辆在抓拍范围内,监控到有障碍物后再进行抓拍。暂时想到的就这么多,后续想到再补上。
最后
文章为原创,若转载请注明出处。该项目的部分代码是经别人代码修改得到,因为时间原因未找到当时下载代码的出处,若项目中部分代码侵犯了您的权益,请联系我,我一定将出处加上。如有冒犯,烦请谅解。
代码下载地址