|
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.") |