File size: 1,785 Bytes
5d670ae
da9f292
5d670ae
da9f292
 
5d670ae
da9f292
89fe87f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
363a646
65ed4c1
363a646
89fe87f
da9f292
89fe87f
3ca006e
 
89fe87f
ee1d691
da9f292
5d670ae
89fe87f
 
 
477d4fe
89fe87f
acddb2f
103f82b
ee1d691
89fe87f
103f82b
ee1d691
89fe87f
8fe1b94
65ed4c1
2132698
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
import easyocr
import numpy as np
import cv2
import re

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

def enhance_image(img):
    # Resize large image down to avoid OCR failure
    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)

    # Convert to gray
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

    # Denoise
    gray = cv2.fastNlMeansDenoising(gray, h=15)

    # Sharpen
    kernel = np.array([[0, -1, 0], [-1, 5,-1], [0, -1, 0]])
    sharp = cv2.filter2D(gray, -1, kernel)

    # Contrast
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    contrast = clahe.apply(sharp)

    return contrast

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

        results = reader.readtext(enhanced)
        print("DEBUG OCR RESULTS:", results)

        ocr_texts = [text for _, text, _ in results]
        weight_candidates = []

        for _, text, conf in results:
            cleaned = text.lower().replace("kg", "").replace("kgs", "")
            cleaned = cleaned.replace("o", "0").replace("s", "5").replace("g", "9")
            cleaned = re.sub(r"[^\d\.]", "", cleaned)

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

        if not weight_candidates:
            return "Not detected", 0.0, "\n".join(ocr_texts)

        best_weight, best_conf = sorted(weight_candidates, key=lambda x: -x[1])[0]
        return best_weight, round(best_conf * 100, 2), "\n".join(ocr_texts)

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