本教程将详细介绍如何使用Flask框架构建一个图片上传与文字识别(OCR)的Web应用。我们将使用EasyOCR作为OCR引擎,实现一个支持中文和英文识别的完整应用。
环境准备
首先,确保你已经安装了Python 3.7+环境,然后安装必要的依赖库:
pip install flask easyocr pillow werkzeug
项目结构
/flask-ocr-app
├── app.py
├── upload/ # 上传文件保存目录
└── templates/
└── index.html # 前端页面
└── static/
├── js/ # jQuery等JS文件
└── css/ # CSS样式文件
代码解析
1. Flask后端关键代码 (app.py)
延迟加载EasyOCR以提高启动速度
# 初始化EasyOCR阅读器(延迟加载)
reader = None
def get_reader():
global reader
if reader is None:
print("正在初始化EasyOCR,首次使用可能需要较长时间...")
start_time = time.time()
reader = easyocr.Reader(['ch_sim', 'en']) # 支持中文简体和英文
print(f"EasyOCR初始化完成,耗时 {
time.time() - start_time:.2f}秒")
return reader
上传图片
@app.route('/upload_image', methods=['POST'])
def upload_image():
"""处理图片上传和OCR识别"""
try:
# 安全保存文件
filename = secure_filename(file.filename)
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)
# 验证是否为有效图片
try:
with Image.open(filepath) as img:
img.verify()
except Exception as e:
os.remove(filepath)
return jsonify({
'error': '无效的图片文件'}), 400
# 执行OCR识别
start_time = time.time()
ocr_reader = get_reader()
result = ocr_reader.readtext(filepath, detail=0) # detail=0只返回文本
# 清理上传的文件
os.remove(filepath)
# 处理识别结果
text = ' '.join(result)
print(f"识别完成,耗时 {
time.time() - start_time:.2f}秒")
return jsonify({
'filter': text})
except Exception as e:
print(f"识别出错: {
str(e)}")
return jsonify({
'error': '识别过程中出错'}), 500
检查文件扩展名是否允许
def allowed_file(filename):
allowed_extensions = {
'png', 'jpg', 'jpeg', 'gif', 'bmp'}
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in allowed_extensions
关键点说明:
- 延迟加载EasyOCR:由于EasyOCR初始化耗时较长,我们使用延迟加载策略,在第一次使用时才初始化。
- 文件上传安全处理:
- 使用
secure_filename
确保文件名安全 - 限制文件大小(5MB)
- 验证文件扩展名
- 使用Pillow验证图片有效性
- 使用
- OCR处理:调用EasyOCR的
readtext
方法进行识别,detail=0
只返回文本内容 - 资源清理:识别完成后立即删除上传的临时文件
2. 前端页面 (templates/index.html)
HTML结构部分
<div class="container py-4