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