本教程將詳細介紹如何使用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
關鍵點說明:
- 延遲加載EasyOCR:由于EasyOCR初始化耗時較長,我們使用延遲加載策略,在第一次使用時才初始化。
- 文件上傳安全處理:
- 使用
secure_filename
確保文件名安全 - 限制文件大小(5MB)
- 驗證文件擴展名
- 使用Pillow驗證圖片有效性
- 使用
- OCR處理:調用EasyOCR的
readtext
方法進行識別,detail=0
只返回文本內容 - 資源清理:識別完成后立即刪除上傳的臨時文件
2. 前端頁面 (templates/index.html)
HTML結構部分
<div class="container py-4