تشخیص پلاک با کتابخانه OpenCV

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

در اینجا مراحل عمومی که باید طی شود را بیان می کنیم:

اکنون می خواهیم این مراحل را به صورت کد برنامه نویسی تبدیل می کنیم.

از زبان برنامه نویسی پایتون و تصویر زیر برای این پروژه استفاده خواهیم کرد.

۱- تشخیص این که داده ی ورودی مربوط به یک تصویر است

تصویر مورد استفاده برای تشخیص پلاک
تصویر مورد استفاده برای تشخیص پلاک

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

کتابخانه OpenCV برای فرآیند پردازش تصویر
کتابخانه های لازم برای فرآیند پردازش تصویر

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

پیش پردازش داده های تصویری
پیش پردازش داده های تصویری

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

تصویر پلاک پس از پیش پردازش
تصویر پس از پیش پردازش

۲- اسکن تصویر و شناسایی اشکال مختلف بر اساس لبه ها

هنگامی که به یک شی نگاه می کنیم، چشمان ما شکل شی را توسط لبه های آن تشخیص می دهند که با زمینه، اجسام اطراف یا اشیا مجاور تفاوت رنگ دارد. بنابراین ، برای اینکه کامپیوتر بتواند تمام اشکال مختلف را در یک تصویر ترسیم کند، باید این مفهوم را در کامپیوتر به کار ببریم.

این کار یک گام مهم محسوب می شود. اگر رایانه نتوانست لبه های مهم تصویر را ترسیم کند، ممکن است نتواند پلاک خودرو را پیدا کند.

تابع Canny را از OpenCV بر روی تصویر پیش پردازش شده اعمال می کنیم تا لبه ها یا گرادیان های رنگ آن را ترسیم کند. برای اطلاعات بیشتر در مورد عملکرد Canny ، اینجا را کلیک کنید.

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

استفاده از تابع Canny
استفاده از تابع Canny

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

تصویر پلاک پس از اعمال تابع Canny
تصویر پس از اعمال تابع Canny

۳- یافتن اشکال مستطیلی از میانه لبه های تصویر

وقتی به انسان تصویری نشان داده می شود که در آن پلاکی وجود داشته باشد، چشم ما قادر به تفکیک و یافتن پلاک در میان تمام اشکال دیگر تصویر است زیرا دانش قبلیمان به ما می گوید که پلاک یک شکل مستطیل با ۴ گوشه متصل به هم است.

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

تشخیص پلاک 06
کد یافتن خطوط محدوده های روی تصویر ها و رسم آن ها
تصویر حاصل پس از ترسیم تمام محدوده ها
تصویر حاصل پس از ترسیم تمام محدوده ها

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

فیلتر و دسته بندی محدوده های حاصل از تصویر قبل
فیلتر و دسته بندی محدوده های حاصل از تصویر قبل
تصویر حاصل از محدوده های دسته بندی شده
تصویر حاصل از محدوده های دسته بندی شده

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

یافتن نواحی مستطیلی شکل
یافتن نواحی مستطیلی شکل
تصویر پلاک حاصل از دستور خط 34
تصویر پلاک حاصل از دستور خط ۳۴
ترسیم محدوده پلاک تصویر اصلی
ترسیم محدوده پلاک تصویر اصلی
تصویر خودرو همراه با محدوده پلاک خودرو
تصویر خودرو همراه با محدوده پلاک خودرو

۴- تشخیص شماره پلاک در محدوده پلاک تشخیص داده شده

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

تشخیص پلاک14
فراخوانی تابع Pytesseract

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

کد استخراج متن از عکس
کد استخراج متن از عکس
تصویر نهایی به همراه متن روی پلاک
تصویر نهایی به همراه متن روی پلاک

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

بیشتر بخوانید:

منبع medium.com

درباره‌ی علی قلی زاده

همچنین ببینید

آموزش شبکه عصبی عمیق با داده های اندک

آموزش شبکه های عصبی عمیق با داده های اندک

استخراج ویژگی در بینایی رایانه مهم است. با نگاشت دادن تصاویر به فضاهای برداری از …

2 نظر

  1. اعداد فارسی چگونه تشخیص داده خواهد شد؟

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *