File size: 2,074 Bytes
975f9c6
 
 
 
 
 
 
 
 
 
 
385a153
975f9c6
 
 
 
 
 
385a153
975f9c6
 
 
 
 
 
385a153
975f9c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
385a153
975f9c6
385a153
975f9c6
 
 
 
 
 
 
385a153
975f9c6
 
385a153
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import easyocr
import numpy as np
import cv2
import re

reader = easyocr.Reader(['en'], gpu=False)

def extract_weight_from_image(pil_img):
    try:
        img = np.array(pil_img)

        # Resize large image if needed
        max_dim = 1000
        height, width = img.shape[:2]
        if max(height, width) > max_dim:
            scale = max_dim / max(height, width)
            img = cv2.resize(img, None, fx=scale, fy=scale, interpolation=cv2.INTER_AREA)

        # OCR
        results = reader.readtext(img)

        weight_candidates = []
        fallback_weight = None
        fallback_conf = 0.0

        for box, (text, conf) in results:  # ✅ Correct unpacking
            cleaned = text.lower().strip()
            cleaned = cleaned.replace(",", ".")
            cleaned = cleaned.replace("o", "0").replace("O", "0")
            cleaned = cleaned.replace("s", "5").replace("S", "5")
            cleaned = cleaned.replace("g", "9").replace("G", "6")
            cleaned = cleaned.replace("kg", "").replace("kgs", "")
            cleaned = re.sub(r"[^0-9\.]", "", cleaned)

            if cleaned and cleaned.replace(".", "").isdigit() and not fallback_weight:
                fallback_weight = cleaned
                fallback_conf = conf

            if cleaned.count(".") <= 1 and re.fullmatch(r"\d{2,4}(\.\d{1,3})?", cleaned):
                weight_candidates.append((cleaned, conf))

        if weight_candidates:
            best_weight, best_conf = sorted(weight_candidates, key=lambda x: -x[1])[0]
        elif fallback_weight:
            best_weight, best_conf = fallback_weight, fallback_conf
        else:
            return "Not detected", 0.0

        # Normalize
        if "." in best_weight:
            int_part, dec_part = best_weight.split(".")
            int_part = int_part.lstrip("0") or "0"
            best_weight = f"{int_part}.{dec_part}"
        else:
            best_weight = best_weight.lstrip("0") or "0"

        return best_weight, round(best_conf * 100, 2)

    except Exception as e:
        return f"Error: {str(e)}", 0.0