当前位置: 首页 > news >正文

Flask + ajax上传文件(三)--图片上传与OCR识别

本教程将详细介绍如何使用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 readerif 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
关键点说明:
  1. 延迟加载EasyOCR:由于EasyOCR初始化耗时较长,我们使用延迟加载策略,在第一次使用时才初始化。
  2. 文件上传安全处理
    • 使用secure_filename确保文件名安全
    • 限制文件大小(5MB)
    • 验证文件扩展名
    • 使用Pillow验证图片有效性
  3. OCR处理:调用EasyOCR的readtext方法进行识别,detail=0只返回文本内容
  4. 资源清理:识别完成后立即删除上传的临时文件

2. 前端页面 (templates/index.html)

HTML结构部分

<div class="container py-4

相关文章:

  • 安服实习面试面经总结(也适合hvv蓝初)
  • 坚果派已适配的鸿蒙版flutter库【持续更新】
  • 什么是Lua模块?你会如何使用NGINX的Lua模块来定制请求处理流程?
  • 从“拼凑”到“构建”:大语言模型系统设计指南!
  • 【开源】基于51单片机的温湿度检测报警系统
  • WPF实现类似Microsoft Visual Studio2022界面效果及动态生成界面技术
  • 矫平机终极指南:特殊材料处理、工艺链协同与全球供应链管理
  • AI日报 - 2025年04月26日
  • 嵌入式学习笔记 - HAL_xxx_MspInit(xxx);函数
  • Prometheus、Zabbix和Nagios针对100个节点的部署设计架构图
  • Python基于Django的全国二手房可视化分析系统【附源码】
  • 2025第十六届蓝桥杯大赛(软件赛)网络安全赛 Writeup
  • 推荐三款GitHub上高星开源的音乐搜索平台
  • proxychains4系统代理for linux(加速国内github下载速度,pip安装)
  • Arm GICv3中断处理模型解析
  • Linux网络编程 原始套接字与ARP协议深度解析——从数据包构造到欺骗攻防
  • browser-use:AI驱动的浏览器自动化工具使用指南
  • 二叉树的遍历(深度优先搜索)
  • 基于AI技术的高速公路交通引流系统设计与应用研究
  • 05-GPIO原理
  • 当隐身13年的北小京决定公开身份 ,专业戏剧评论依然稀缺
  • 财政部下达农业生产防灾救灾资金3.76亿元,支持黄淮海等地抗旱保春播
  • 从世界工厂走向全球创新中心,上海车展为何成为全球汽车行业风向标?
  • 强政神鸟——故宫里的乌鸦
  • 单位被裁定补缴12年社保,滞纳金该谁出?
  • 王毅会见乌兹别克斯坦外长赛义多夫