داشتن یک برنامه یا فرایند ذهنی ما را به سمتی سوق می دهد که به کشف راه مناسب برای رسیدن به هدف خود بپردازیم. در این پروژه هدف ما ساختن برنامه ای برای شناسایی پلاک خودرو هاست. سوالی که برای شروع این پروژه مطرح می شود این است که اگر تصویری به ما تحویل داده شود، چگونه پلاک خودرو را پیدا کرده و متن کاراکتر های پلاک را از آن استخراج کنیم؟
در اینجا مراحل عمومی که باید طی شود را بیان می کنیم:
- ۱- تشخیص این که داده ی ورودی یک تصویر است.
- ۲- تصویر را اسکن کنیم تا همه اشکال مختلفی که توسط لبه های آن مشخص می شوند، را شناسایی کنیم.
- ۳- با توجه به اینکه پلاک یک شکل مستطیلی است، از تمام اشکال مختلف مرحله قبلی، اشکالی را پیدا کنیم که با شکل مستطیل مطابقت داشته باشد.
- ۴- پس از یافتن شکل مستطیلی، اطلاعات داخل این شکل شماره پلاک خواهد بود.
اکنون می خواهیم این مراحل را به صورت کد برنامه نویسی تبدیل می کنیم.
از زبان برنامه نویسی پایتون و تصویر زیر برای این پروژه استفاده خواهیم کرد.
۱- تشخیص این که داده ی ورودی مربوط به یک تصویر است

برای اینکه پایتون داده های ورودی را پردازش کند، کتابخانه های مناسب را وارد می کنیم. در اینجا از OpenCV یا (cv2) برای خواندن تصویر استفاده خواهیم کرد. علاوه بر این، می خواهیم اندازه تصویر را با Imutils به عرض ۵۱۲ پیکسل استاندارد کنیم ( ۵۱۲ پیکسل را انتخاب کردیم زیرا حد وسط بین اندازه تصویر در مقابل جزئیات تصویر است و کتابخانه Imutils به طور خودکار ارتفاع آن را متناسب با نسبت اصلی خود تنظیم می کند).

پس از خواندن تصویر، آن را به مقیاس خاکستری تبدیل کردیم. نه تنها تبدیل به مقیاس خاکستری پیچیدگی محاسبات را کاهش می دهد، بلکه برای یافتن خطوط (در مراحل بعدی) نیز مهم است زیرا OpenCV از اشیا اتصال دهنده سفید در زمینه های سیاه خطوطی پیدا می کند.

تصویر پس از تغییر اندازه و تبدیل به مقیاس خاکستری به شکل زیر خواهد بود:

۲- اسکن تصویر و شناسایی اشکال مختلف بر اساس لبه ها
هنگامی که به یک شی نگاه می کنیم، چشمان ما شکل شی را توسط لبه های آن تشخیص می دهند که با زمینه، اجسام اطراف یا اشیا مجاور تفاوت رنگ دارد. بنابراین ، برای اینکه کامپیوتر بتواند تمام اشکال مختلف را در یک تصویر ترسیم کند، باید این مفهوم را در کامپیوتر به کار ببریم.
این کار یک گام مهم محسوب می شود. اگر رایانه نتوانست لبه های مهم تصویر را ترسیم کند، ممکن است نتواند پلاک خودرو را پیدا کند.
تابع Canny را از OpenCV بر روی تصویر پیش پردازش شده اعمال می کنیم تا لبه ها یا گرادیان های رنگ آن را ترسیم کند. برای اطلاعات بیشتر در مورد عملکرد Canny ، اینجا را کلیک کنید.
قبل از استفاده از تابع Canny، ابتدا روش صاف کردن را برای کاهش نویز روی تصویر اعمال می کنیم. در اینجا، روش فیلتر دو طرفه را برای تصویر اعمال کردیم تا ضمن حفظ وضوح لبه ها، نویز را کاهش دهد. برای اطلاعات بیشتر در مورد فیلتر دو طرفه یا روش های مختلف صاف کردن تصویر، اینجا را کلیک کنید.

توجه : پارامترهای داخل این دو توابع برای همه شرایط مناسب نیستند. باید برای برنامه شما تنظیم شود.

۳- یافتن اشکال مستطیلی از میانه لبه های تصویر
وقتی به انسان تصویری نشان داده می شود که در آن پلاکی وجود داشته باشد، چشم ما قادر به تفکیک و یافتن پلاک در میان تمام اشکال دیگر تصویر است زیرا دانش قبلیمان به ما می گوید که پلاک یک شکل مستطیل با ۴ گوشه متصل به هم است.
برای استفاده از این ایده در پایتون، ابتدا findContours در OpenCV را روی شکل ۴ اعمال می کنیم تا تمام خطوط بسته را پیدا کنیم. سپس، برای نمایش آن ها، از تابع drawContours استفاده می کنیم تا خطوط را بر روی تصویر اصلی ترسیم کنیم. برای اطلاعات بیشتر در مورد findContours و drawContour، اینجا را کلیک کنید.


همانطور که در شکل ۶ نشان داده شده است، تصویر دارای خطوط زیادی است که بیشتر آن ها شکل صحیحی ندارند یا مساحتی را ندارند که به شکل مستطیل در نظر گرفته شود. بنابراین، اشکال را براساس مساحت آن ها مرتب کرده و خطوط را با مساحت آن ها تفکیک می کنیم. در آخر، برای نمایش خطوط فیلتر شده دوباره از تابع drawContour استفاده می کنیم.


سپس، شکلی را پیدا کنید که به عنوان پلاک مناسب باشد، یعنی یک شکل مستطیل. برای این کار، بر روی هر یک از خطوط باقی مانده arcLength و approxPolyDP را برای تخمین تقریبی خطوط بسته استفاده می کنیم. پس از پیدا شدن شکل، از تابع boundingRect برای تعیین نقاط گوشه ای جهت برش استفاده می کنیم. برای اطلاعات بیشتر در مورد این توابع، اینجا را کلیک کنید.




۴- تشخیص شماره پلاک در محدوده پلاک تشخیص داده شده
به محض یافتن محدوده صحیح پلاک، باید متن پلاک را از محدوده تشخیص داده شده استخراج کنیم. برای انجام این کار، از Pytesseract استفاده می کنیم. پس نیاز به نصب Teseract و تنظیم آن با Pytesseract داریم. برای آشنایی با نحوه بارگذاری Teseract برای ویندوز، اینجا را کلیک کنید.

برای استخراج متن از محدوده تشخیص داده شده از تابع “image_to_string” استفاده کنید. لطفاً توجه داشته باشید، «config» پارامتر متفاوتی است و ممکن است لازم باشد در هر برنامه تغییر کند. برای دریافت اطلاعات بیشتر اینجا را ببینید.


استفاده از OpenCV و Pytesseract برای تشخیص شماره پلاک ها از روی عکس یک روش معمول است. اما با داشتن یک نقشه راه و برنامه ریزی مناسب ، در مورد رویکردی که می خواهید در پیش بگیرید ایده های خوبی به شما می دهد و می توانید بسته به نیاز خود پروژه های پیچیده تری را پیاده سازی کنید.
اعداد فارسی چگونه تشخیص داده خواهد شد؟
برای تشخیص اعداد فارسی باید یه شبکه مخصوص OCR اعداد و حروف فارسی آموزش داده بشه
همچنین میتونید از کتابخانه تشخیص پلاک ساتپا توی برنامتون استفاده کنید