| import easyocr | |
| import cv2 | |
| import numpy as np | |
| from PIL import Image, ImageEnhance | |
| import re | |
| import os | |
| class SimpleLicensePlateOCR: | |
| def __init__(self): | |
| self.reader = None | |
| self._initialize_reader() | |
| def _initialize_reader(self): | |
| try: | |
| print("Initializing EasyOCR...") | |
| self.reader = easyocr.Reader(['en'], gpu=False, verbose=False) | |
| print("EasyOCR initialized successfully") | |
| return True | |
| except Exception as e: | |
| print(f"Failed to initialize EasyOCR: {e}") | |
| return False | |
| def preprocess_image(self, image): | |
| try: | |
| if isinstance(image, Image.Image): | |
| img = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR) | |
| else: | |
| img = image | |
| gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
| enhanced = cv2.equalizeHist(gray) | |
| kernel = np.ones((1,1), np.uint8) | |
| enhanced = cv2.morphologyEx(enhanced, cv2.MORPH_CLOSE, kernel) | |
| enhanced = cv2.morphologyEx(enhanced, cv2.MORPH_OPEN, kernel) | |
| return enhanced | |
| except Exception as e: | |
| print(f"Preprocessing error: {e}") | |
| return np.array(image) if isinstance(image, Image.Image) else image | |
| def extract_text(self, image): | |
| if self.reader is None: | |
| return "OCR Reader not initialized" | |
| try: | |
| processed_img = self.preprocess_image(image) | |
| results = self.reader.readtext(processed_img, detail=False, paragraph=False) | |
| if not results: | |
| if isinstance(image, Image.Image): | |
| img_array = np.array(image) | |
| else: | |
| img_array = image | |
| results = self.reader.readtext(img_array, detail=False, paragraph=False) | |
| if results: | |
| text = ' '.join(results).strip() | |
| cleaned_text = self.clean_text(text) | |
| print(f"OCR Results: Raw='{text}' Cleaned='{cleaned_text}'") | |
| return cleaned_text if cleaned_text else text | |
| else: | |
| print("No text detected by OCR") | |
| return "No text detected" | |
| except Exception as e: | |
| print(f"OCR extraction error: {e}") | |
| return f"OCR Error: {str(e)}" | |
| def clean_text(self, text): | |
| if not text: | |
| return "" | |
| text = text.upper().strip() | |
| text = re.sub(r'[^A-Z0-9\s-]', '', text) | |
| text = re.sub(r'\s+', ' ', text).strip() | |
| if len(text) < 3: | |
| return text | |
| text = text.replace(' ', '') | |
| return text | |
| ocr_instance = SimpleLicensePlateOCR() | |
| def extract_license_plate_text(image): | |
| try: | |
| if isinstance(image, str): | |
| if os.path.exists(image): | |
| image = Image.open(image) | |
| else: | |
| return "Image file not found" | |
| result = ocr_instance.extract_text(image) | |
| print(f"Final OCR result: {result}") | |
| return result | |
| except Exception as e: | |
| error_msg = f"Error in text extraction: {str(e)}" | |
| print(error_msg) | |
| return error_msg | |
| if __name__ == "__main__": | |
| print("Testing License Plate OCR...") | |
| test_image = "test_plate.jpg" | |
| if os.path.exists(test_image): | |
| result = extract_license_plate_text(test_image) | |
| print(f"Test result: {result}") | |
| else: | |
| print("No test image found. Place a license plate image as 'test_plate.jpg' to test.") |