Spaces:
Paused
Paused
| """ | |
| OCR-инструменты: pytesseract для титула и PaddleOCR для датчиков. | |
| """ | |
| import cv2 | |
| import numpy as np | |
| from paddleocr import PaddleOCR | |
| import pytesseract | |
| # -------------------------- | |
| # OCR титула (pytesseract) | |
| # -------------------------- | |
| def ocr_title(img: np.ndarray) -> str: | |
| """ | |
| OCR верхней области (титул мнемосхемы). | |
| """ | |
| if img is None or img.size == 0: | |
| return "" | |
| gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
| gray = cv2.convertScaleAbs(gray, alpha=2.0, beta=-40) | |
| binary = cv2.adaptiveThreshold( | |
| gray, 255, | |
| cv2.ADAPTIVE_THRESH_GAUSSIAN_C, | |
| cv2.THRESH_BINARY_INV, | |
| 15, 9 | |
| ) | |
| text = pytesseract.image_to_string(binary, lang="eng+rus", config="--psm 7").strip() | |
| return text | |
| # -------------------------- | |
| # OCR датчиков (PaddleOCR) | |
| # -------------------------- | |
| paddle_ocr = PaddleOCR( | |
| lang="ru", | |
| ocr_version="PP-OCRv4", | |
| use_doc_orientation_classify=False, | |
| use_doc_unwarping=False, | |
| use_textline_orientation=False | |
| ) | |
| def ocr_sensors(rois: list[np.ndarray]) -> list[dict]: | |
| """ | |
| OCR областей сенсоров через PaddleOCR.predict(). | |
| Формат вывода: | |
| [{"text": str, "score": float}, ...] | |
| """ | |
| results = [] | |
| if not rois: | |
| return [] | |
| try: | |
| ocr_results = paddle_ocr.predict(rois) | |
| except Exception as e: | |
| print(f"⚠ Ошибка OCR.predict: {e}") | |
| return [{"text": "?", "score": 0.0} for _ in rois] | |
| for out in ocr_results: | |
| texts = out.get("rec_texts", ["?"]) | |
| scores = out.get("rec_scores", [0.0]) | |
| # --- распаковка --- | |
| text = texts[0] if texts else "?" | |
| score = scores[0] if scores else 0.0 | |
| results.append({"text": text, "score": round(score, 2)}) | |
| return results | |