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

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
http://www.xdnf.cn/news/2107.html

相关文章:

  • DataStreamAPI实践原理——计算模型
  • 上位机知识篇---时钟分频
  • [mysql]数据类型精讲下
  • 【Linux网络】HTTP协议全解析 - 从请求响应到方法与Header
  • SpringBoot UserAgentUtils获取用户浏览器 操作系统设备统计 信息统计 日志入库
  • 从基础到实战的量化交易全流程学习:1.1 量化交易本质与行业生态
  • C++---类和对象(二)
  • VO包装类和实体类分别是什么?区别是什么?
  • C++学习笔记(四十)——STL之归约算法
  • 深入探究 MySQL 架构:从查询到硬件
  • Apache NetBeans 25 发布
  • 任务管理系统,Java+Vue,含源码与文档,科学规划任务节点,全程督办保障项目落地提效
  • priority_queue的学习
  • GoFly快速开发框架新增UI素材库-帮助开发者快速开发管理后台UI基于ArcoDesign框架开发
  • 服务器传输数据存储数据建议 传输慢的原因
  • 文本预处理(NLTK)
  • 图像处理——边缘检测
  • 【C++11】Lambda表达式
  • 区块链实战:Hyperledger Fabric多节点网络部署与高性能业务链码
  • 【运维】Windows 与 Linux 中实时查看日志的命令对比详解(tail -f)
  • 二叉搜索树的实现与应用场景
  • 指标监控:Prometheus 结合 Grafana,监控redis、mysql、springboot程序等等
  • 3:QT联合HALCON编程—海康相机SDK二次程序开发
  • 深入详解人工智能数学基础——微积分中拉格朗日乘数法在GAN训练中的应用
  • python调用ffmpeg对截取视频片段,可批量处理
  • 写了一个关于SpringAop记录用户操作的功能
  • A. Ambitious Kid
  • MySQL 联合查询教程
  • 使用PyTorch实现简单图像识别(基于MNIST手写数字数据集)的完整代码示例,包含数据加载、模型定义、训练和预测全流程
  • 深度探索:DeepSeek赋能WPS图表绘制