هل تساءلت يومًا كيف يعمل نظام ANPR (التعرف التلقائي على لوحة الأرقام)؟ دعني أخبرك بالمفهوم الكامن وراء ذلك ، تلتقط كاميرا نظام ANPR صورة لوحة ترخيص السيارة ثم تتم معالجة الصورة من خلال عدد متعدد من الخوارزميات لتوفير تحويل رقمي ألفا للصورة إلى تنسيق نصي. يستخدم نظام ANPR في العديد من الأماكن مثل مضخات البنزين ومراكز التسوق والمطارات والطرق السريعة وأكشاك الرسوم والفنادق والمستشفيات ومواقف السيارات ونقاط التفتيش العسكرية والدفاعية وما إلى ذلك.
هناك العديد من أدوات معالجة الصور المتاحة لاكتشاف لوحة الأرقام ، ولكن هنا في هذا البرنامج التعليمي سوف نستخدم معالجة الصور MATLAB للحصول على رقم لوحة ترخيص السيارة في تنسيق النص. إذا كنت جديدًا مع MATLAB أو معالجة الصور ، فتحقق من مشاريع MATLAB السابقة:
- الشروع في العمل مع MATLAB: مقدمة سريعة
- الشروع في معالجة الصور باستخدام MATLAB
أولاً ، دعني أطلعك على المفهوم الذي نستخدمه للكشف عن لوحات الأرقام. هناك ثلاثة برامج أو ملفات ".m" لهذا المشروع.
- إنشاء القالب ( template_creation.m ) - يستخدم هذا لاستدعاء الصور المحفوظة للأبجدية الرقمية ثم حفظها كقالب جديد في ذاكرة MATLAB.
- اكتشاف الحرف ( Letter_detection.m ) - لقراءة الأحرف من صورة الإدخال والعثور على أعلى مطابقة أبجدية رقمية مطابقة
- اكتشاف اللوحة ( Plate_detection.m ) - قم بمعالجة الصورة ثم قم باستدعاء ملفي m أعلاه لاكتشاف الرقم.
الآن ، سوف نتعلم كيفية ترميز هذه الملفات وما عليك القيام به قبل البدء في الترميز. بعد الاطلاع على هذا البرنامج التعليمي ، يمكنك العثور على جميع ملفات التعليمات البرمجية وفيديو شرح العمل في نهاية هذا المشروع.
إنشاء القالب
قم أولاً بإنشاء مجلد للمشروع (اسم المجلد الخاص بي هو Number Plate Detection ) لحفظ الملفات وتخزينها. قمنا بتخزين الصور الثنائية لجميع الحروف الهجائية والأرقام في المجلد الفرعي المسمى " ألفا" .
الآن ، افتح نافذة المحرر في MATLAB ، كما هو موضح في الصورة أدناه ،
إذا لم تكن على دراية بالمصطلحات الأساسية لـ MATLAB ، أقترح عليك مراجعة البرنامج التعليمي المرتبط.
الآن ، انسخ الكود أدناه والصقه في ملف template_creation.m ، واحفظ الملف في مجلد المشروع ( Number Plate Detection ). يمكن تنزيل جميع الملفات المتعلقة بهذا المشروع بما في ذلك ملفات قوالب الصور من هنا. تحقق أيضًا من الفيديو المقدم في نهاية هذا المشروع.
٪ Alphabets A = imread ('alpha / A.bmp') ؛ B = imread ('alpha / B.bmp') ؛ C = imread ('alpha / C.bmp') ؛ D = imread ('alpha / D.bmp') ؛ E = imread ('alpha / E.bmp') ؛ F = imread ('alpha / F.bmp') ؛ G = imread ('alpha / G.bmp') ؛ H = imread ('alpha / H.bmp') ؛ I = imread ('alpha / I.bmp') ؛ J = imread ('alpha / J.bmp') ؛ K = imread ('alpha / K.bmp') ؛ L = imread ('alpha / L.bmp') ؛ M = imread ('alpha / M.bmp') ؛ N = imread ('alpha / N.bmp') ؛ O = imread ('alpha / O.bmp') ؛ P = imread ('alpha / P.bmp') ؛ Q = imread ('alpha / Q.bmp') ؛ R = imread ('alpha / R.bmp') ؛ S = imread ('alpha / S.bmp') ؛ T = imread ('alpha / T.bmp') ؛ U = imread ('alpha / U.bmp') ؛ V = imread ('alpha / V.bmp') ؛ W = imread ('alpha / W.bmp') ؛ X = imread ('alpha / X.bmp ') ؛ Y = imread ('alpha / Y.bmp') ؛ Z = imread ('alpha / Z.bmp') ؛ ٪ الأرقام الطبيعية 1 = imread ('alpha / 1.bmp') ؛ اثنان = imread ('alpha / 2.bmp') ؛ ثلاثة = imread ('alpha / 3.bmp') ؛ أربعة = imread ('alpha / 4.bmp') ؛ خمسة = imread ('alpha / 5.bmp') ؛ ستة = imread ('alpha / 6.bmp') ؛ سبعة = imread ('alpha / 7.bmp') ؛ ثمانية = imread ('alpha / 8.bmp') ؛ تسعة = imread ('alpha / 9.bmp') ؛ صفر = imread ('alpha / 0.bmp') ؛ ٪ تكوين صفيف للحروف الأبجدية = ؛ ٪ تكوين مصفوفة لرقم = ؛ NewTemplates = ؛ save ('NewTemplates'، 'NewTemplates') امسح الكل
هنا ، في الكود أعلاه نقوم بحفظ الصور في متغير باستخدام الأمر " imread () ". تُستخدم هذه الوظيفة لاستدعاء الصور من المجلد أو من أي مكان على جهاز الكمبيوتر إلى MATLAB. لنأخذ مثالاً من الكود أعلاه:
A = imread ('alpha / A.bmp') ؛
حيث A هو المتغير ، وفي " alpha / A.bmp" ، "alpha" هو اسم المجلد و " A.bmp" هو اسم الملف.
ثم قم بإنشاء مصفوفة من " letter " و " number " وحفظها في المتغير " NewTemplates " باستخدام الأمر " save (filename، variables)" .
٪ تكوين صفيف للحروف الأبجدية = ؛ ٪ تكوين مصفوفة لرقم = ؛ NewTemplates = ؛ save ('NewTemplates'، 'NewTemplates') امسح الكل
ابدأ الآن بترميز Letter_detection.m ، في نافذة محرر جديدة.
كشف الرسالة
هنا نقوم بإنشاء ملف الكود الثاني المسمى Letter_detection.m . الآن ، انسخ الكود أدناه والصقه في هذا الملف واحفظ الملف في مجلد المشروع باسم Letter_detection. يمكن تنزيل هذا الملف من هنا ، وتحتوي هذه الملفات المضغوطة المرفقة أيضًا على ملفات أخرى متعلقة بمشروع الكشف عن لوحة الأرقام.
حرف الوظيفة = readLetter (snap) تحميل NewTemplates snap = imresize (snap،) ؛ rec = ؛ لـ n = 1: length ( NewTemplates ) cor = corr2 (NewTemplates {1، n}، snap) ؛ rec = ؛ end ind = find (rec == max (rec)) ؛ عرض (اعثر (rec == max (rec))) ؛ ٪ قوائم الحروف الهجائية. إذا كانت ind == 1 - ind == 2 حرف = 'A' ؛ elseif ind == 3 - ind == 4 حرف = 'B' ؛ elseif ind == 5 letter = 'C' elseif ind == 6 - ind == 7 حرف = 'D' ؛ elseif ind == 8 حرف = 'E' ؛ elseif ind == 9 حرف = 'F' ؛ elseif ind == 10 حرف = 'G' ؛ elseif ind == 11 حرف = 'H' ؛ elseif ind == 12 حرف = 'I' ؛ elseif ind == 13 حرف = 'J' ؛ elseif ind == 14 حرف = 'K' ؛ elseif ind == 15 حرف = 'L' ؛ elseif ind == 16 حرف = 'M' ؛ elseif ind == 17 حرف = 'N' ؛ elseif ind == 18 - ind == 19 حرف = 'O' ؛ elseif ind == 20 - ind == 21 حرف = 'P' ؛ elseif ind == 22 - ind == 23 حرف = 'Q' ؛ elseif ind == 24 - ind == 25 حرف = 'R' ؛ elseif ind == 26 حرف = 'S' ؛ elseif ind == 27 حرف = 'T' ؛ elseif ind == 28 letter = 'U' ؛ elseif ind == 29 حرف = 'V' ؛ elseif ind == 30 حرف = 'W' ؛ elseif ind == 31 حرف = 'X' ؛ آخرإند == 32 حرف = 'Y' ؛ elseif ind == 33 حرف = 'Z' ؛ ٪ * - * - * - * - * ٪ الأرقام القوائم. elseif ind == 34 حرف = '1' ؛ elseif ind == 35 حرف = '2' ؛ elseif ind == 36 حرف = '3' ؛ elseif ind == 37 - ind == 38 حرف = '4' ؛ elseif ind == 39 حرف = '5' ؛ elseif ind == 40 - ind == 41 - ind == 42 letter = '6' ؛ elseif ind == 43 حرف = '7' ؛ elseif ind == 44 - ind == 45 letter = '8' ؛ elseif ind == 46 - ind == 47 - ind == 48 letter = '9' ؛ حرف آخر = '0' ؛ نهاية النهاية
هنا، في رمز أعلاه قمنا بإنشاء اسمه ظيفة إلكتروني مما يعطينا الناتج أبجدية من الصورة المدخلة من "الطبقة ألفا " باستخدام الأمر ' readLetter ()' . ثم قم بتحميل القوالب المحفوظة باستخدام تحميل الأوامر 'NewTemplates .
بعد ذلك ، قمنا بتغيير حجم صورة الإدخال بحيث يمكن مقارنتها بصور القالب باستخدام الأمر "imresize (اسم الملف ، الحجم)" . ثم يتم استخدام حلقة for لربط صورة الإدخال بكل صورة في القالب للحصول على أفضل تطابق.
يتم إنشاء مصفوفة ' rec ' لتسجيل قيمة الارتباط لكل قالب أبجدي رقمي مع قالب الأحرف من صورة الإدخال ، كما هو موضح في الكود أدناه ،
cor = corr2 (NewTemplates {1، n}، snap) ؛
ثم يتم استخدام الأمر "find ()" للعثور على الفهرس الذي يتوافق مع الحرف الأكثر مطابقة. ثم وفقًا لهذا الفهرس ، تتم طباعة الحرف المقابل باستخدام عبارة "if-else" .
الآن ، بعد الانتهاء من ذلك ، افتح نافذة محرر جديدة لبدء رمز البرنامج الرئيسي.
كشف لوحة الأرقام
إليك ملف الكود الثالث والأخير المسمى Plate_detection.m ، نسخ ولصق الكود أدناه في هذا الملف وحفظه في مجلد المشروع. للبدء السريع ، يمكنك تنزيل جميع ملفات الأكواد مع قوالب الصور من هنا.
أغلق الكل امسح الكل؛ im = imread ('Number Plate Images / image1.png') ؛ imgray = rgb2gray (im) ؛ imbin = imbinarize (imgray) ؛ im = edge (imgray، 'prewitt') ؛ ٪ الخطوات أدناه للعثور على موقع لوحة الأرقام Iprops = regionprops (im، 'BoundingBox'، 'Area'، 'Image')؛ المنطقة = Iprops.Area ؛ العد = numel (Iprops) ؛ maxa = مساحة ؛ boundingBox = Iprops.BoundingBox ، بالنسبة إلى i = 1: عد إذا كان maxa
الأوامر الأساسية المستخدمة في الكود أعلاه مذكورة أدناه:
imread () - يستخدم هذا الأمر لفتح الصورة في MATLAB من المجلد الهدف.
rgb2gray () - يستخدم هذا الأمر لتحويل صورة RGB إلى تنسيق تدرج الرمادي.
imbinarize () - يُستخدم هذا الأمر لترميز صورة ثنائية الأبعاد بتدرج الرمادي أو يمكننا القول ببساطة إنه يحول الصورة إلى تنسيق أبيض وأسود.
edge () - يُستخدم هذا الأمر لاكتشاف الحواف في الصورة ، باستخدام طرق مختلفة مثل Roberts و Sobel و Prewitt وغيرها الكثير.
regionprops () - يُستخدم هذا الأمر لقياس خصائص منطقة الصورة.
numel () - يستخدم هذا الأمر لحساب عدد عناصر المصفوفة.
imcrop () - يُستخدم هذا الأمر لاقتصاص الصورة بالحجم المُدخل.
bwareaopen () - يُستخدم هذا الأمر لإزالة الكائنات الصغيرة من الصورة الثنائية.
باستخدام الأوامر المذكورة أعلاه في الكود ، فإننا نستدعي صورة الإدخال ونحولها إلى التدرج الرمادي. ثم يتم تحويل التدرج الرمادي إلى صورة ثنائية ، ويتم الكشف عن حافة الصور الثنائية بطريقة Prewitt.
ثم يتم استخدام الكود أدناه لاكتشاف موقع لوحة الأرقام في صورة الإدخال بالكامل ،
Iprops = regionprops (im، 'BoundingBox'، 'Area'، 'Image') ؛ المنطقة = Iprops.Area ؛ العد = numel (Iprops) ؛ maxa = مساحة ؛ boundingBox = Iprops.BoundingBox ، بالنسبة إلى i = 1: عد إذا كان maxa
بعد ذلك ، قم بقص لوحة الأرقام وإزالة الكائنات الصغيرة من الصورة الثنائية باستخدام الأمر "imcrop ()" و "bwareaopen ()" على التوالي.
بعد ذلك ، يتم استخدام الكود أدناه لمعالجة صورة لوحة الترخيص التي تم اقتصاصها ولعرض الرقم المكتشف في الصورة وتنسيق النص (في نافذة الأوامر).
Iprops = regionprops (im، 'BoundingBox'، 'Area'، 'Image') ؛ العد = numel (Iprops) ؛ noPlate = ؛ بالنسبة إلى i = 1: count ow = length (Iprops (i). Image (1،:)) ؛ oh = length (Iprops (i). Image (:، 1)) ؛ إذا كان ow <(h / 2) & oh> (h / 3) letter = Letter_detection (Iprops (i).Image) ؛ noPlate = نهاية النهاية
العمل على نظام كشف رقم لوحة المركبة باستخدام MATLAB
في ملف template_creation.m ، قمنا بتصميم الكود لحفظ جميع الصور الثنائية للأبجدية الرقمية في دليل أو ملف باسم " NewTemplates ". ثم يتم استدعاء هذا الدليل في Letter_detection.m كما ترى في الأسفل
ثم في Plate_detection.m ملف رمز Letter_detection.m يسمى ملف التعليمات البرمجية عندما نقوم بمعالجة الصورة كما هو مبين في الصورة أدناه،
الآن ، انقر فوق الزر "RUN" لتشغيل ملف.m
قد يستغرق MATLAB بضع ثوان للرد ، انتظر حتى تظهر رسالة مشغول في الزاوية اليسرى السفلية كما هو موضح أدناه ،
عند بدء البرنامج ، ستحصل على صورة لوحة الأرقام المنبثقة والرقم في نافذة الأوامر. سيبدو ناتج صورتي مثل الصورة الموضحة أدناه ؛
يتم توضيح العمل الكامل لنظام الكشف عن لوحة رقم المركبة في الفيديو أدناه ، ويمكن تنزيل جميع ملفات الرموز مع قوالب الصور من هنا.
تحقق أيضًا من جميع مشاريع MATLAB هنا.