Spaces:
Sleeping
Sleeping
| import cv2 | |
| import glob | |
| import json | |
| import os.path | |
| import traceback | |
| import numpy as np | |
| from PIL import Image | |
| import sys | |
| import os | |
| path = os.path.abspath("../../python") | |
| sys.path.append(path) | |
| import ultimateAlprSdk | |
| class LicensePlateRecognizer: | |
| def __init__(self, | |
| image_types_mapping, | |
| is_save=False, | |
| is_result_show=False, | |
| save_path=""): | |
| """ | |
| LicensePlateRecognizer classini instansiyasini ishga tushirish. | |
| Parameters: | |
| json_config : dict | |
| JSON formatidagi konfiguratsiya sozlamalari. | |
| image_types_mapping : dict | |
| Rasm rejimlarini ularning mos keladigan turlariga solishtirish. | |
| """ | |
| self.image_types_mapping = image_types_mapping | |
| self.image_save_path = save_path | |
| self.is_save = is_save | |
| self.is_result_show = is_result_show | |
| self.result_dict = {} | |
| def load_cv2_image(self, path): | |
| """ | |
| OpenCV (cv2) kutubxonasi yordamida rasmni berilgan joydan oqib olish funksiyasi. | |
| Parameters: | |
| path : str | |
| rasm o'qib olish joyi. | |
| Returns: | |
| image: ndarray (height, width, channels) | |
| Tuple tipidagi rasm va rasm tipi | |
| Raises: | |
| ValueError | |
| Agar rasm yuklanmasa yoki rasmdagi kanallar soni noto'g'ri bo'lsa. | |
| """ | |
| image = cv2.imread(path) | |
| if image is None: | |
| raise ValueError("Failed to load image: %s" % path) | |
| # rasmning yo'nalishini tekshirish. | |
| orientation = 1 | |
| try: | |
| pil_image = Image.open(path) | |
| exif_data = pil_image.getexif() | |
| if exif_data is not None: | |
| for tag, value in exif_data.items(): | |
| if tag == 0x0112: | |
| orientation = value | |
| break | |
| except Exception as e: | |
| print("An exception occurred: {}".format(e)) | |
| traceback.print_exc() | |
| # Agar rasm 1 dan katta orientatsiya qiymatiga ega bo'lsa, | |
| # u mos ravishda aylantiriladi. | |
| if orientation > 1: | |
| rotate_code = cv2.ROTATE_90_CLOCKWISE if orientation == 6 else cv2.ROTATE_90_COUNTERCLOCKWISE | |
| image = cv2.rotate(image, rotate_code) | |
| # Rasmni RGB ga aylantirish. | |
| image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) | |
| # Rasm turi tasvirdagi kanallar soniga qarab aniqlanadi. | |
| image_mode = None | |
| if image.shape[2] == 3: | |
| image_mode = 'RGB' | |
| elif image.shape[2] == 4: | |
| image_mode = 'RGBA' | |
| elif image.shape[2] == 1: | |
| image_mode = 'L' | |
| else: | |
| raise ValueError("Invalid number of channels in the image") | |
| if image_mode not in self.image_types_mapping: | |
| raise ValueError("Invalid mode: %s" % image_mode) | |
| image_type = self.image_types_mapping[image_mode] | |
| return image, image_type | |
| def visualize_result(self, image): | |
| """ | |
| Rasmga bbox va labellar chizish orqali visualizatsiya qilish. | |
| Parameters: | |
| image : ndarray | |
| Rasm. | |
| Returns: | |
| image: ndarray | |
| bbox va labellar orqali ozgartirilgan rasm. | |
| """ | |
| if "plates" not in self.result_dict: | |
| print("No license plates found in the result.") | |
| return image | |
| plates = self.result_dict["plates"] | |
| # bounding boxes va labellarni rasmga chizish | |
| for plate in plates: | |
| plate_text = plate["text"] | |
| confidence_det = plate["confidences"][1] | |
| warped_box = plate["warpedBox"] | |
| pts = np.array([(warped_box[i], warped_box[i + 1]) for i in range(0, len(warped_box), 2)], dtype=np.int32) | |
| cv2.polylines(image, [pts], True, (0, 255, 0), 2) | |
| cv2.putText(image, f"{plate_text} ({confidence_det:.2f})", tuple(pts[0]), cv2.FONT_HERSHEY_SIMPLEX, 0.8, | |
| (0, 255, 0), 2) | |
| if "car" in plate: | |
| car_box = np.array(plate["car"]["warpedBox"], dtype=np.int32).reshape((-1, 2)) | |
| cv2.polylines(image, [car_box], True, (255, 0, 0), 2) | |
| car_confidence = plate["car"]["confidence"] | |
| car_text = f"Car Confidence: {car_confidence:.2f}%" | |
| text_position = (car_box[0][0], car_box[0][1] - 10) | |
| font = cv2.FONT_HERSHEY_SIMPLEX | |
| font_scale = 0.5 | |
| font_thickness = 1 | |
| cv2.putText(image, car_text, text_position, font, font_scale, (255, 0, 0), font_thickness) | |
| return image | |
| def save_result_image(self, image, image_path): | |
| """ | |
| Rasmni berilgan joyga saqlash | |
| Parameters: | |
| image : ndarray | |
| Rasm. | |
| image_path : str | |
| Rasm saqlash joyi. | |
| """ | |
| filename = os.path.basename(image_path) | |
| result_image_path = os.path.join(self.image_save_path, filename) | |
| cv2.imwrite(result_image_path, image) | |
| print("Result image saved:", result_image_path) | |
| def check_result(self, operation, result): | |
| """ | |
| Operatsiya natijasini tekshirish va natijani korib chiqish funksiyasi. | |
| Parameters: | |
| operation : str | |
| bajarilgan operatsiya tavsifi. | |
| result : Result | |
| Tekshirish uchun Result ob'ekti. | |
| Raises: | |
| AssertionError | |
| Agar operatisiya natijasi muvaffaqiyatsiz chiqsa. | |
| """ | |
| if not result.isOK(): | |
| print(TAG + operation + ": failed -> " + result.phrase()) | |
| assert False | |
| else: | |
| print(TAG + operation + ": OK -> " + result.json()) | |
| result_dict = json.loads(result.json()) | |
| if not result_dict: | |
| return None | |
| self.result_dict = result_dict | |
| def process_images(self, image_path): | |
| """ | |
| Ultimate ALPR SDK dan foydalangan holda belgilangan rasm papkasidan | |
| rasmlarni qayta ishlash. | |
| Raises: | |
| OSError | |
| Agar rasm papkasida fayl mavjud bo'lmasa. | |
| """ | |
| image, image_type = self.load_cv2_image(image_path) | |
| height, width, channels = image.shape | |
| results = ultimateAlprSdk.UltAlprSdkEngine_process( | |
| image_type, | |
| image.tobytes(), | |
| width, | |
| height, | |
| 0, | |
| 1 | |
| ) | |
| self.check_result("Process", results) | |
| if "plates" in self.result_dict: | |
| image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) | |
| image = self.visualize_result(image) | |
| image = cv2.resize(image, display_size) | |
| if self.is_result_show: | |
| cv2.imshow("License Plate Recognition", image) | |
| cv2.waitKey(0) | |
| cv2.destroyAllWindows() | |
| # agar save true bolsa rasmni berilgan papkaga saqlash | |
| if self.is_save: | |
| self.save_result_image(image, image_path) | |
| if __name__ == "__main__": | |
| PROJECT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')) | |
| display_size = (1200, 700) | |
| TAG = "[PythonRecognizer] " | |
| JSON_CONFIG = { | |
| "debug_level": "info", | |
| "debug_write_input_image_enabled": False, | |
| "debug_internal_data_path": ".", | |
| "num_threads": -1, | |
| "gpgpu_enabled": True, | |
| "max_latency": -1, | |
| "klass_vcr_gamma": 1.5, | |
| "detect_roi": [0, 0, 0, 0], | |
| "detect_minscore": 0.1, | |
| "car_noplate_detect_min_score": 0.8, | |
| "pyramidal_search_enabled": True, | |
| "pyramidal_search_sensitivity": 0.28, | |
| "pyramidal_search_minscore": 0.3, | |
| "pyramidal_search_min_image_size_inpixels": 800, | |
| "recogn_rectify_enabled": True, | |
| "recogn_minscore": 0.3, | |
| "recogn_score_type": "min", | |
| "assets_folder": os.path.join(PROJECT_DIR, 'assets'), | |
| "charset": "latin" | |
| } | |
| IMAGE_TYPES_MAPPING = { | |
| 'RGB': ultimateAlprSdk.ULTALPR_SDK_IMAGE_TYPE_RGB24, | |
| 'RGBA': ultimateAlprSdk.ULTALPR_SDK_IMAGE_TYPE_RGBA32, | |
| 'L': ultimateAlprSdk.ULTALPR_SDK_IMAGE_TYPE_Y | |
| } | |
| # rasmlar joyi | |
| image_folder = os.path.join(PROJECT_DIR, 'assets', 'images') | |
| # natija rasimlarni saqlash joyi | |
| save_img_path = os.path.join(PROJECT_DIR, 'assets', 'result_imgs') | |
| recognizer = LicensePlateRecognizer(IMAGE_TYPES_MAPPING, | |
| is_save=True, | |
| save_path=save_img_path, | |
| is_result_show=False) | |
| recognizer.check_result("Init", | |
| ultimateAlprSdk.UltAlprSdkEngine_init( | |
| json.dumps(JSON_CONFIG))) | |
| images = glob.glob(os.path.join(image_folder, '*.*')) | |
| for image_path in images: | |
| if not os.path.isfile(image_path): | |
| raise OSError("File doesn't exist: %s" % image_path) | |
| print("rasm manzili") | |
| recognizer.process_images(image_path) | |
| recognizer.check_result("DeInit", ultimateAlprSdk.UltAlprSdkEngine_deInit()) |