Spaces:
Sleeping
Sleeping
| import cv2 | |
| import json | |
| import re | |
| import os | |
| def recognize_with_openocr(img, name="default", min_score=0.8, ocr_engine=None): | |
| """ | |
| 使用 OpenOCR 執行辨識 | |
| - img: OpenCV 影像 | |
| - name: 儲存暫存圖用的名稱 | |
| - min_score: 過濾最低信心分數 | |
| - ocr_engine: 必須傳入已初始化的 OpenOCR 引擎 | |
| """ | |
| if ocr_engine is None: | |
| raise ValueError("ocr_engine is required") | |
| TEMP_FOLDER = "./temp_imgs" | |
| os.makedirs(TEMP_FOLDER, exist_ok=True) | |
| temp_path = os.path.join(TEMP_FOLDER, f"temp_{name}.jpg") | |
| cv2.imwrite(temp_path, img) | |
| result, _ = ocr_engine(temp_path) | |
| if result is None: | |
| return [], 0.0 | |
| try: | |
| result_json = json.loads(result[0].split('\t')[1]) | |
| valid = [r for r in result_json if r.get("score", 0) >= min_score] | |
| texts = [ | |
| re.sub(r'[^A-Z0-9\\-]', '', r["transcription"].strip().upper()) | |
| for r in valid if r["transcription"].strip() | |
| ] | |
| avg_score = sum(r["score"] for r in valid) / len(valid) if valid else 0.0 | |
| # print(f"[{name}] OCR 結果:{texts} (Avg Score: {avg_score:.2f})") | |
| return texts, avg_score | |
| except Exception as e: | |
| print(f"[{name}] JSON 解析失敗:{e}") | |
| return [], 0.0 | |