File size: 2,465 Bytes
76f34f5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import cv2
import numpy as np
import os
os.makedirs('/app/.easyocr', exist_ok=True)

from inference_sdk import InferenceHTTPClient

# تعريف العميل
CLIENT = InferenceHTTPClient(
    api_url="https://serverless.roboflow.com",
    api_key="4m9tZRxBfEK8C4no7zsZ"
)
reader = easyocr.Reader(['en'], model_storage_directory='/app/.easyocr')
def detect_license_plate(image_path, model_id="license-plate-recognition-rxg4e/11"):
    """إجراء التنبؤ باستخدام نموذج Roboflow"""
    result = CLIENT.infer(image_path, model_id=model_id)
    return result

def extract_plate_from_image(image_path, predictions):
    """استخلاص صورة اللوحة من الصورة الكاملة بناءً على التنبؤات"""
    image = cv2.imread(image_path)
    max_confidence = 0
    best_coords = None

    for prediction in predictions['predictions']:
        confidence = prediction['confidence']
        if confidence > max_confidence:
            max_confidence = confidence
            x = int(prediction['x'])
            y = int(prediction['y'])
            width = int(prediction['width'])
            height = int(prediction['height'])
            x1 = int(x - width / 2)
            y1 = int(y - height / 2)
            x2 = int(x + width / 2)
            y2 = int(y + height / 2)
            best_coords = (x1, y1, x2, y2)

    if not best_coords:
        return None  # لم يتم الكشف عن أي لوحة

    x1, y1, x2, y2 = best_coords
    polygon_points = np.array([
        [x1, y1],
        [x2, y1],
        [x2, y2],
        [x1, y2]
    ], dtype=np.int32)

    mask = np.zeros(image.shape[:2], dtype=np.uint8)
    cv2.fillPoly(mask, [polygon_points], 255)

    masked_image = cv2.bitwise_and(image, image, mask=mask)
    x, y, w, h = cv2.boundingRect(polygon_points)
    cropped_plate = masked_image[y:y+h, x:x+w]

    return cropped_plate

def enhance_image_for_ocr(image):
    """تحسين الصورة لاستخلاص النصوص باستخدام EasyOCR"""
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    return gray

def extract_license_number(image):
    """استخراج الأرقام من صورة اللوحة"""
    result = reader.readtext(image)
    plate_numbers = []

    for detection in result:
        text = detection[1]
        numbers_only = ''.join(c for c in text if c.isdigit())
        if numbers_only:
            plate_numbers.append(numbers_only)
    return plate_numbers