WebMain.py
import uvicorn
if __name__ == '__main__':
uvicorn.run(app='Web:app', host='0.0.0.0', port=8000, reload=True)
Web.py
from imghdr import what
import subprocess
import cv2
import numpy as np
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.get("/")
def info():
return {"ok"}
# get请求
@app.post("/api/ocr")
async def create_upload_file(file: UploadFile = File(...)):
# 读取字节流
bytes_stream = await file.read()
# 字节流转图片(转换失败为None,图片超过400K直接返回None不作处理)
srcImg = bytesToImg(bytes_stream)
# 判断上传是否为JPG图片
b_isJPG = isJPG(srcImg)
# 处理文件格式
if b_isJPG is False:
return {"success": 0, "msg": "上传文件过大或格式不正确!"}
else:
# 图片等比例缩放(定宽550)
resize_Img = imgResize(srcImg)
# 图片本地保存
imgSave(resize_Img)
# 图文识别(只负责识别出结果,解析放在端处理)
res_obj = ocr()
# 生成响应
result = responseJson(res_obj)
return result
# post请求
def ocr():
res = subprocess.getoutput(
r'./ocr_db_crnn ch_ppocr_mobile_v2.0_det_opt.nb ch_ppocr_mobile_v2.0_rec_opt.nb ch_ppocr_mobile_v2.0_cls_opt.nb ./tmp.jpg ppocr_keys_v1.txt')
return res
# 图文识别
def responseJson(resJson):
res = {"success": 1, "msg": "成功", "data": resJson}
return res
# 生成响应体JSON
def isJPG(image):
if image is None: # 转换失败
return False
else:
isimg = what(image)
# 识别文件是否是jpg
if isimg == "jpeg":
return True
else:
return False
# 判断上传文件是否是JPG图片
def imgSave(image):
cv2.imwrite('./tmp.jpg', image)
# 图片本地保存
def bytesToImg(byteStream):
try:
if len(byteStream) > (400*1024): # 超过400K不作处理
return None
else:
resImg = cv2.imdecode(np.frombuffer(
byteStream, np.uint8), cv2.IMREAD_COLOR)
return resImg
except Exception:
return None
# 字节流转图片
def imgResize(image):
# 输入你想要resize的图像宽度。
Width_size = 550
# 获取原始图像宽高。
height, width = image.shape[0], image.shape[1]
# 等比例缩放尺度。
scale = width/Width_size
# 获得相应等比例的图像高度。
Height_size = int(height/scale)
# 缩放
image_resize = cv2.resize(image, (Width_size, Height_size))
return image_resize
# 图片等比例缩放
what 在win平台上可以用在linux上不行没做过多研究直接不做检查注释掉那个模块,有空再来研究