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.mzph.cn/news/903550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模型部署技巧(一)

模型部署技巧&#xff08;一&#xff09; 以下内容是参考CUDA与TensorRT模型部署内容第六章&#xff0c;主要针对图像的前/后处理中的trick。 参考&#xff1a; 1.部署分类器-int8-calibration 2. cudnn安装地址 3. 如何查找Tensor版本&#xff0c;与cuda 和 cudnn匹配 4. ti…

MySQL--数据引擎详解

存储引擎 MySQL体系结构 连接层&#xff1a; 主要接收客户端的连接&#xff0c;然后完成一些链接的处理&#xff0c;以及认证授权的相关操作和安全方案&#xff0c;还要去检查是否超过最大连接数等等&#xff0c;比如在连接MySQL服务器时需要输入用户名&#xff0c;密码&#…

【含文档+PPT+源码】基于微信小程序的健康饮食食谱推荐平台的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的健康饮食食谱推荐平台的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…

当OA闯入元宇宙:打卡、报销和会议的未来狂想

引言&#xff1a;虚实共生中的组织基因突变 元宇宙正以虚实共生的形态重构人类协作的底层逻辑。传统OA系统建立的物理规则——指纹打卡验证在场性、纸质票据堆砌信任链、会议室排期协调时空资源——在元宇宙的数字原野上迎来基因级重组。这场变革不仅是技术工具的迭代&#xf…

解决vscode cmake提示检测到 #include 错误

一、问题 cmake已经包含了动态库文件&#xff0c;依然提示“检测到 #include 错误。请更新 includePath。” 二、解决方案 Ctrl Shift P进入CPP编辑配置&#xff0c;然后在JSON中加入下面一行&#xff1a; "configurationProvider": "ms-vscode.cmake-tools&…

2024ICPC成都题解

文章目录 L. Recover Statistics(签到)J. Grand Prix of Ballance(模拟签到)A. Arrow a Row(构造)B. Athlete Welcome Ceremony(线性dp)G. Expanding Array(打表结论)I. Good Partitions(线段树)E. Disrupting Communications(换根dpLCA倍增)K. Magical Set(费用流) 题目链接 …

达梦数据库官方迁移工具SQLark:支持Oracle/MySQL/PostgreSQL迁移至达梦数据库!

SQLark 百灵连接是一款面向信创应用开发者的数据库开发和管理工具&#xff0c;由达梦数据历时三年自主研发&#xff0c;注册即可免费使用客户端&#xff08;官网链接www.sqlark.com&#xff09;。今天&#xff0c;我们将重点介绍SQLark的特色功能之一——数据迁移&#xff0c;该…

映射关系4

好&#xff01;我明白了&#xff01;&#x1f4a5; 你希望我在你的基础上&#xff0c;继续优化 insertPathWithIds&#xff0c;让它&#xff1a; • 支持每一级节点的 idPart 是字符串&#xff08;而不是int&#xff09;。 • 结构更清晰&#xff0c;更快拼接。 • 完全符合C98…

PDF Shaper v15.0

如今对PDF处理的软件很多都是只是单一的功能。PDF Shaper给你完全不同的体验&#xff0c;因为PDF Shaper是一款免费的PDF工具集合的软件。有了PDF Shaper&#xff0c;你以后再也不用下载其他处理PDF的软件了。PDF Shaper的功能有&#xff1a;合并&#xff0c;分割&#xff0c;加…

【Python爬虫基础篇】--4.Selenium入门详细教程

先解释&#xff1a;Selenium&#xff1a;n.硒&#xff1b;硒元素 目录 1.Selenium--简介 2.Selenium--原理 3.Selenium--环境搭建 4.Selenium--简单案例 5.Selenium--定位方式 6.Selenium--常用方法 6.1.控制操作 6.2.鼠标操作 6.3.键盘操作 6.4.获取断言信息 6.5.…

mysql8.0版本部署+日志清理+rsync备份策略

mysql安装&#xff1a;https://blog.csdn.net/qq_39399966/article/details/120205461 系统&#xff1a;centos7.9 数据库版本&#xff1a;mysql8.0.28 1.卸载旧的mysql,保证环境纯净 rpm -qa | grep mariadb mariadb-5.... rpm -e --nodeps 软件 rpm -e --nodeps mariadb-5.…

C#进阶学习(十七)PriorityQueue<TElement, TPriority>优先级队列的介绍

1. PriorityQueue是什么&#xff1f;作用是什么&#xff1f; 定义&#xff1a;PriorityQueue<TElement, TPriority> 是 C# (.NET 6 引入) 中的泛型优先级队列数据结构。 那么是什么是优先级队列呢&#xff1f;优先级队列是一种抽象数据结构&#xff0c;其核心特性是元素按…

如何查看和验证AWS CloudFront的托管区域ID

在使用AWS Route 53设置DNS记录时,正确识别CloudFront分发的托管区域ID是至关重要的。本文将详细介绍几种查看和验证CloudFront托管区域ID的方法,特别关注中国区CloudFront的特殊情况。 为什么托管区域ID很重要? 托管区域ID是AWS服务中的一个关键标识符。在创建指向CloudF…

kafka整合flume与DStream转换

一、Kafka整合flume cd /opt/software/flume/conf/ vi flume-kafka.conf a1.sourcesr1 a1.sinksk1 a1.channelsc1 a1.sources.r1.typespooldirt a1.sources.r1.spoolDir/root/flume-kafka a1.sinks.k1.typeorg.apache.flume.sink.kafka.KafkaSink a1.sinks.k1.kafka.to…

网络通讯【QTcpServer、QTcpSocket、QAbstractSocket】

目录 QTcpServer class简单描述成员函数和信号 QTcpSocket Class详细描述成员函数和信号 QAbstractSocket Class详细描述成员函数和信号成员函数说明文档 QT实现服务器和客户端通讯服务器端&#xff1a;通讯流程原代码 客户端通信流程原代码 QTcpServer class header: #includ…

大模型在肾癌诊疗全流程中的应用研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 国内外研究现状 二、大模型预测肾癌术前情况 2.1 基于影像组学的肾癌良恶性及分级预测 2.1.1 MRI 影像组学模型预测肾透明细胞癌分级 2.1.2 CT 影像深度学习模型鉴别肾肿物良恶性及侵袭性 2.2 大模型对手术风…

网络原理 - 11(HTTP/HTTPS - 2 - 请求)

目录 HTTP 请求&#xff08;Request&#xff09; 认识 URL URL 基本格式 关于 URL encode 认识方法&#xff08;method&#xff09; 1. GET 方法 2. POST 方法 认识请求“报头”&#xff08;header&#xff09; Host Content-Length Content-Type User-Agent&…

实现MySQL高可用性:从原理到实践

目录 一、概述 1.什么是MySQL高可用 2.方案组成 3.优势 二、资源清单 三、案例实施 1.修改主机名 2.安装MySQL数据库&#xff08;Master1、Master2&#xff09; 3.配置mysql双主复制 4.安装haproxy&#xff08;keepalived1、keepalived2&#xff09; 5.安装keepaliv…

CSS学习笔记8——表格

一、表格 1-1、创建表格 在Word文档中&#xff0c;如果要创建表格&#xff0c;只需插入表格&#xff0c;然后设定相应的行数和列数即可。然而在HTML网页中&#xff0c;所有的元素都是通过标签定义的&#xff0c;要想创建表格&#xff0c;就需要使用与表格相关的标签。使用标签…

爬虫学习笔记(一)

目的 通过编写程序爬取互联网上的优质资源 爬虫必须要使用python吗 非也~ 编程语言知识工具&#xff0c;抓取到数据才是目的&#xff0c;而大多数爬虫采用python语言编写的原因是python的语法比较简单&#xff0c;python写爬虫比较简单&#xff01;好用&#xff01;而且pyt…