Spaces:
Runtime error
Runtime error
File size: 1,359 Bytes
6b14fa5 65ed4c1 8fe1b94 a71f519 6b14fa5 18f53a5 6b14fa5 65ed4c1 363a646 65ed4c1 18f53a5 363a646 65ed4c1 18f53a5 363a646 18f53a5 701d11a 18f53a5 f901f58 18f53a5 f901f58 18f53a5 103f82b f901f58 103f82b 18f53a5 f901f58 8fe1b94 65ed4c1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
import easyocr
import numpy as np
import cv2
import re
# Load the OCR engine
reader = easyocr.Reader(['en'], gpu=False)
def extract_weight_from_image(pil_img):
try:
# Convert PIL to OpenCV image (numpy array)
img = np.array(pil_img)
# Step 1: Preprocess image for better OCR
img = cv2.resize(img, None, fx=3, fy=3, interpolation=cv2.INTER_LINEAR)
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
blur = cv2.GaussianBlur(gray, (3, 3), 0)
_, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
thresh = cv2.bitwise_not(thresh) # Invert for dark digits
# Step 2: Run OCR
results = reader.readtext(thresh, detail=1)
# Step 3: Extract numbers like 65.20 or 50
weight_candidates = []
for bbox, text, conf in results:
clean = text.lower().replace("kg", "").replace("kgs", "").strip()
if re.fullmatch(r"\d{2,4}(\.\d{1,2})?", clean):
weight_candidates.append((clean, conf))
if not weight_candidates:
return "Not detected", 0.0
# Step 4: Choose highest confidence number
weight, confidence = sorted(weight_candidates, key=lambda x: -x[1])[0]
return weight, round(confidence * 100, 2)
except Exception as e:
return f"Error: {str(e)}", 0.0
|