概述
通过开源库HyperLPR可以快速的读取车牌号码,为了方便我们可以将Python脚本封装成WEBAPI接口,采用轻量级Flask实现,方便第三方应用对接使用,以下是python关键代码,其它权限控制简略。
主要实现:通过API接口上传一张含有车牌号码的照片,API接口给出车牌识别结果。同时提供图片在线查看URL,对车牌进行标注。
HyperLPR官方地址:
https://github.com/zeusees/HyperLPR
安装库环境
#更新pip源
pip3 install --upgrade pip
#安装HyperLPR
pip3 install hyperlpr
#安装HyperLPR指定的opencv版本
pip3 install opencv-python==3.4.9.31
#安装flask框架用于搭建WebApi接口
pip3 install flask
Python脚本代码
import datetime
import flask
import json
import cv2
from flask import Flask, request, make_response
from hyperlpr import *
sever = Flask(__name__)
@sever.route("/upload", methods=["post"])
def upload():
f = flask.request.files.get('file', None) # 上传文件,取一个名字,再给名字一个默认值None
if f: # 如果文件不为空
filename = str(f.filename)
suffix = filename[filename.rfind('.'):]
cur_time = datetime.datetime.now().strftime(
"%Y%m%d%H%M%S") # 如果上传同一个文件两次,会被覆盖,所以加一个当前日期,并指定日期格式strftime("%Y%m%d%H%M%S")
new_file_name = cur_time + suffix # 新文件名=时间+原来的文件名
new_file_name = os.path.join('cars', new_file_name)
print('new_file_name', new_file_name)
f.save(new_file_name) # 保存文件
info = scanImage(new_file_name)
res = {"msg": "文件上传成功", 'data': info}
else:
res = {"msg": "没有上传文件"}
return json.dumps(res, ensure_ascii=False) # 防止出现乱码
def scanImage(new_file_name):
img = cv2.imread(new_file_name)
# 识别结果
cars = HyperLPR_plate_recognition(img)
print(cars)
# [['川A00000', 0.9829636641911098, [256, 184, 391, 231]]]
arr = []
for car in cars:
label = car[0]
confidence = car[1]
point = car[2]
cv2.rectangle(img, (point[0], point[1]), (point[2], point[3]), (0, 0, 255), 2)
arr.append({'label': label, 'confidence': confidence, 'point': point})
cv2.imwrite(new_file_name, img)
url = '/' + new_file_name.replace('\\', '/')
carInfo = {'filename': new_file_name, 'url': url, 'cars': arr}
return carInfo
@sever.route('/cars/<string:filename>', methods=['GET'])
def show_photo(filename):
if request.method == 'GET':
if filename is None:
pass
else:
image_data = open(os.path.join('cars', filename), "rb").read()
response = make_response(image_data)
response.headers['Content-Type'] = 'image/png'
return response
else:
pass
sever.run(port=8888)
调用演示
采用Postman提交演示数据
{
"msg": "文件上传成功",
"data": {
"filename": "cars\\20210517154417.jpeg",
"url": "/cars/20210517154417.jpeg",
"cars": [
{
"label": "浙J2L252",
"confidence": 0.9824417659214565,
"point": [
256,
184,
391,
231
]
}
]
}
}
图片标注访问
通过图标标注可以预览图片中车牌的位置信息
http://127.0.0.1:8888/cars/20210517154417.jpeg
访问JSON字符串返回的url地址,如图所示