前段时间练习过的一个小项目,今天再看看,记录一下~
开发工具准备:
- 开发工具:PyCharm
- Python内置模块:os、time、datetime
- 第三方模块:pygame、opencv-python、pandas、matplotlib、baidu-aip
pygame模块:实现项目主窗体
opencv-python模块:调用摄像头进行拍照
pandas模块:数据处理(创建保存数据文件)
baidu-aip模块:进行车牌识别获取车牌号
matplotlib模块:绘制柱状图
项目组织结构:
说明:
- datefile文件夹:保存车辆信息表的xlsx文件
- file文件夹:保存图片文件夹。ic_launcher.jpg是窗体的右上角图标文件;income.png是实现收入统计的柱状图(下一篇文章实现);key.txt是使用百度的图片识别AI接口申请的key;test.jpg保存的是摄像头抓取的图片
- venv文件夹:项目所需要的各种模块,即项目运行环境
- btn.py文件:按钮模块
- main.py文件:程序主文件
- ocrutil.py文件:车牌识别模块
- timeutil.py文件:时间处理模块
实现系统主窗体:(pygame模块)
- 初始化pygame游戏模块
- 设置窗体名称
- 设置窗体图标
- 设置窗体大小和背景颜色
- 在主线程中不断更新界面,如果遇到关闭窗口事件,就退出
在main.py文件写入如下代码:(可以作为实现系统窗体的主要框架)
import pygame
size=1000,484 # 窗体大小
FPS=60 # 设置帧率(屏幕每秒的刷新次数)
# 设置背景颜色
DARKBLUE=(73,119,142)
BG=DARKBLUE
# 1.初始化
pygame.init()
# 2.设置窗体名称
pygame.display.set_caption('智能停车场车牌识别计费系统')
# 3.加载图片,设置图标
ic_launcher=pygame.image.load('file/ic_launcher.jpg')
pygame.display.set_icon(ic_launcher)
# 4.设置窗体大小、背景颜色
screen=pygame.display.set_mode(size)
screen.fill(BG)
# 游戏循环帧率设置(控制程序运行时间)
clock=pygame.time.Clock()
# 主线程
while True:
for event in pygame.event.get():
# 关闭页面游戏退出
if event.type==pygame.QUIT:
pygame.quit()
exit()
pygame.display.flip() # 更新界面
clock.tick(FPS) # 控制游戏最大帧率为60
部分代码说明:
- pygame.event.get():获取事件队列,使用for…in遍历所有事件;
- event.type:用于判断事件类型;
- pygame.QUIT为关闭pygame窗口事件
运行效果如图:
获取摄像头画面:(opencv-python模块)
- 导入opencv-python模块;
- 初始化摄像头,并创建摄像头实例。VideoCapture( )方法可以采集摄像头捕获到的图像,其中参数为摄像头的ID,设置为0表示第一个摄像头,如果有多个摄像头就设置为摄像头ID;
- 通过摄像头实例,在while循环中获取图片并保存在file文件夹的test.jpg中,然后把图片绘制到窗体上。
此时的main.py代码如下:
import pygame
import cv2
size=1000,484 # 窗体大小
FPS=60 # 设置帧率(屏幕每秒的刷新次数)
# 设置背景颜色
DARKBLUE=(73,119,142)
BG=DARKBLUE
# 1.初始化
pygame.init()
# 2.设置窗体名称
pygame.display.set_caption('智能停车场车牌识别计费系统')
# 3.加载图片,设置图标
ic_launcher=pygame.image.load('file/ic_launcher.jpg')
pygame.display.set_icon(ic_launcher)
# 4.设置窗体大小、背景颜色
screen=pygame.display.set_mode(size)
screen.fill(BG)
try:
cam=cv2.VideoCapture(0) # 创建摄像头实例
except:
print('请连接摄像头')
# 游戏循环帧率设置(控制程序运行时间)
clock=pygame.time.Clock()
# 主线程
while True:
# 从摄像头读取图片
sucess, img = cam.read()
# 保存图片
cv2.imwrite('file/test.jpg', img)
# 加载图像
image = pygame.image.load('file/test.jpg')
# 设置图片大小
image = pygame.transform.scale(image, (640, 480))
# 绘制视频画面
screen.blit(image, (2, 2))
for event in pygame.event.get():
# 关闭页面游戏退出
if event.type==pygame.QUIT:
pygame.quit()
exit()
pygame.display.flip() # 更新界面
clock.tick(FPS) # 控制游戏最大帧率为60
运行效果如图:
注意:如果运行失败,可能是自己电脑的摄像头驱动有问题,需要重新下载。我当时就遇到了这个问题。
下载网址:https://newsupport.lenovo.com.cn/driveDownloads_index.html
点击【在站内查找设备驱动】,然后按照主机编号和电脑型号下载摄像头驱动
创建保存数据文件:(pandas模块)
该项目需要创建两个表,一个用于保存当前停车场里的车辆信息,另一个用于保存所有进入过停车场的车辆进出信息。主要用到pandas模块和os模块。
main.py文件代码如下:
import pygame
import pandas as pd
from pandas import DataFrame
import os
import cv2
size=1000,484 # 窗体大小
FPS=60 # 设置帧率(屏幕每秒的刷新次数)
# 设置背景颜色
DARKBLUE=(73,119,142)
BG=DARKBLUE
#定义颜色
BLAK=(0,0,0)
WHITE=(255,255,255)
GREEN=(0,255,0)
BLUE=(72,61,139)
GRAY=(96,96,96)
RED=(220,20,60)
YELLOW=(255,255,0)
#获取当前项目的路径
cdir=os.getcwd()
#文件路径
path=cdir+'/datafile/'
if not os.path.exists(path):
os.makedirs(path) #根据路径建立文件夹
#车牌号、日期、价格、状态
carnfile=pd.DataFrame(columns=['carnumber','date','price','state'])
#生成.xlsx文件
carnfile.to_excel(path+'停车场车辆表.xlsx',sheet_name='data')
carnfile.to_excel(path+'停车场信息表.xlsx', sheet_name='data')
# 1.初始化
pygame.init()
# 2.设置窗体名称
pygame.display.set_caption('智能停车场车牌识别计费系统')
# 3.加载图片,设置图标
ic_launcher=pygame.image.load('file/ic_launcher.jpg')
pygame.display.set_icon(ic_launcher)
# 4.设置窗体大小、背景颜色
screen=pygame.display.set_mode(size)
screen.fill(BG)
try:
cam=cv2.VideoCapture(0) # 创建摄像头实例
except:
print('请连接摄像头')
# 游戏循环帧率设置(控制程序运行时间)
clock=pygame.time.Clock()
# 主线程
while True:
# 从摄像头读取图片
sucess, img = cam.read()
# 保存图片
cv2.imwrite('file/test.jpg', img)
# 加载图像
image = pygame.image.load('file/test.jpg')
# 设置图片大小
image = pygame.transform.scale(image, (640, 480))
# 绘制视频画面
screen.blit(image, (2, 2))
for event in pygame.event.get():
# 关闭页面游戏退出
if event.type==pygame.QUIT:
pygame.quit()
exit()
pygame.display.flip() # 更新界面
clock.tick(FPS) # 控制游戏最大帧率为60
运行效果如图:
识别车牌(核心功能):
申请百度的图片识别Key:
- 进入官网:https://ai.baidu.com/,点击右上角的控制台,进行登录;
- 登录成功之后,在左侧栏目中依次选择【人工智能】→【图像识别】
- 再点击【创建应用】,应用名称和应用类型可以自己写,【接口选择】部分把【文字识别】里面的【车牌识别】选上,其他部分可以不管。创建成功之后界面如下:
- 再把这3个信息写到file/key.txt文件里面,格式如下:
识别车牌模块:
在ocrutil.py文件中实现车牌识别,调用百度AI接口识别图片,获取车牌号,代码如下:
from aip import AipOcr
import os
#百度识别车牌
filename='file/key.txt' # 记录申请的key的文件位置
if os.path.exists(filename): # 判断文件是否存在
with open(filename,"r") as file: # 以只读方式打开文件
dictkey=eval(file.readlines()[0]) # 读取全部内容,并且转换为字典
APP_ID=dictkey['APP_ID'] # 获取申请的APIID
API_KEY=dictkey['API_KEY'] # 获取申请的APIKEY
SECRET_KEY