پلاک را با OCR بخوانید

چکیده
خیلی نزدیک! اکنون تصاویر خرد شده با شماره های پلاک فقط داریم. این از نمای بزرگراه ، پایین تا نمای اتومبیل ، به پلاک مجوز گرفته شده است. در این مرحله ، تصویر را برای بهبود OCR از قبل پردازش می کنیم و شخصیت ها را از تصویر می خوانیم.
TOC (گام به گام)
دستور العمل
مراحل پیش پردازش زیر به تمرکز OCR فقط بر روی اطلاعات مهم تصویر کمک می کند و همه چیز را کاهش می دهد (به عنوان مثال رنگ RBG ، خاکستری ها ، کانتورهای کوچک). برای وضوح این توالی قبل از پردازش قبل از OCR الگوی نسبتاً معمولی قبل از OCR در دید رایانه است. من در اینجا چیز جدیدی را اختراع یا کشف نمی کنم. در پایین مقاله ، OCR را بدون پیش پردازش اجرا می کنیم تا تفاوت را نشان دهیم.
قبل از پیش پردازش – تصویر بریده شده از پلاک از مراحل قبلی:
-
مرحله قبل از پردازش: رنگهای desaturate. خاکستری برو
رنگ RGB در اینجا برای OCR مفید نیست. مهم نیست که شماره های پلاک Magenta یا Cyan باشد. بنابراین اطلاعات رنگ را دور بریزید.
-
مرحله قبل از پردازش: تار گاوسی برای کاهش اندکی سر و صدا / مصنوعات.
قسمت “گاوسی” را هرگز نبرید. این فقط استفاده از یک فیلتر تاری روی تصویر است. این فیلتر تار تفاوت های کوچک را نرم می کند. و از آنجا که اختلافات کوچک کاهش می یابد (به عنوان مثال پلاک Dirty-ish) ، تفاوت های بزرگی برای تشخیص آسانتر است (به عنوان مثال Dark-Nbsers در زمینه سفید).
-
مرحله قبل از پردازش: آستانه برای برجسته کردن شخصیت های پلاک
آستانه برجسته های بیشتر در جایی که ما تفاوت های بزرگی از قبیل شماره های تیره در زمینه سفید را داریم.
-
پلاک OCR
من در اینجا با یک دسته از کتابخانه های OCR آزمایش کردم. من بهترین حالت را برای این استفاده کردم که Paddleocr ، بهتر از Tesseract و برخی دیگر بود. Paddleocr را روی تصویر آستانه اجرا کنید و متن رشته ای ، شماره پلاک را دریافت کنید ، از تصویر برگردید!
-
سود!
import cv2
from paddleocr import PaddleOCR, draw_ocr
from ppocr.utils.logging import get_logger
import logging
# Initialize PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang='en', use_space_char=True)
logger = get_logger()
logger.setLevel(logging.ERROR) # avoid debug statements in OCR results
#baseDir="/Users/japollock/Projects/TrainHighwayCarDetector/"
baseDir = '/home/pi/Projects/TrainHighwayCarDetector/'
img_path = baseDir + 'photos/yolo_licensePlates/croppedPlates/IMG_4554_0002.jpg'
print("Human readable is CEZ2594")
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
ret, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)
# Perform OCR
result = ocr.ocr(thresh, cls=True)
for line in result:
print(line)
چاپ خروجی بیانیه
[[[[14.0, 29.0], [181.0, 22.0], [184.0, 76.0], [17.0, 83.0]], ('CEZ2594', 0.9654235243797302)]]
پلاک را می خوانیم! تعداد در سمت راست رشته اعتماد به نفس یعنی 96.5 ٪ ~ با اعتماد به نفس صحیح است. و شماره های سمت چپ مختصات جعبه محدود است. 🥳
لینک بعدی: همه آن را با هم ببندید: تشخیص پلاک پایان به پایان
پیوست: منابع
پیوست: نکات جالب
ممکن است مردمی تعجب کنند: چرا فقط تصویر اصلی را انجام نمی دهیم؟ شما می توانید اما این همان چیزی است که شما دریافت می کنید:
به سمت راست توجه داشته باشید نه جعبه محدوده قرمز. اولا ، سه از هفت شخصیت اشتباه است. این همان ورودی است که ما فقط نشان دادیم ، یک صفحه مجوز همان تصویر ، فقط بدون مراحل قبل از پردازش. ثانیا ، نمره اعتماد به نفس پایین است. به همین دلیل مراحل پیش پردازش است.