import easyocr import numpy as np import re import cv2 reader = easyocr.Reader(['en'], gpu=False) def extract_weight_from_image(pil_img): try: img = np.array(pil_img) # Convert to grayscale gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # Apply bilateral filter to reduce noise while keeping edges filtered = cv2.bilateralFilter(gray, 11, 17, 17) # Apply binary threshold _, thresh = cv2.threshold(filtered, 150, 255, cv2.THRESH_BINARY_INV) # Find contours contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if not contours: return "No weight detected", 0.0 # Get the largest contour assuming it's the display area largest_contour = max(contours, key=cv2.contourArea) x, y, w, h = cv2.boundingRect(largest_contour) # Add padding pad = 10 x, y = max(x - pad, 0), max(y - pad, 0) cropped = gray[y:y+h+pad, x:x+w+pad] # OCR on cropped area result = reader.readtext(cropped, detail=0) combined = " ".join(result) print("Detected Text:", combined) # Match weight patterns like 52.30 or 003.25 match = re.search(r"\b\d{2,4}\.?\d{0,2}\b", combined) if match: return match.group(), 95.0 else: return "No weight detected", 0.0 except Exception as e: return f"Error: {str(e)}", 0.0