האם תהית אי פעם כיצד עובדת מערכת ANPR (זיהוי לוח מספרים אוטומטי)? תן לי לספר לך את הרעיון שעומד מאחוריה, המצלמה של מערכת ANPR מצלמת תמונה של לוחית רישוי לרכב ואז התמונה מעובדת באמצעות מספר רב של אלגוריתמים כדי לספק המרה אלפרית של התמונה לפורמט טקסט. מערכת ANPR משמשת במקומות רבים כמו משאבות דלק, קניונים, שדות תעופה, כבישים מהירים, תאי אגרה, מלונות, בתי חולים, חניונים, נקודות ביטחון ונקודות בדיקה צבאיות וכו '.
ישנם כלים רבים לעיבוד תמונה לזיהוי לוחית מספר זה, אך כאן במדריך זה נשתמש בעיבוד תמונה של MATLAB בכדי להביא את מספר לוחית הרישוי לרכב לפורמט הטקסט. אם אתה חדש עם MATLAB או עיבוד תמונה, בדוק את הפרויקטים הקודמים של MATLAB:
- תחילת העבודה עם MATLAB: מבוא מהיר
- תחילת העבודה עם עיבוד תמונות באמצעות MATLAB
ראשית, תן לי לתאר לך את הרעיון בו אנו משתמשים לגילוי לוחיות מספר. ישנן שלוש תוכניות או קבצי '.m' לפרויקט זה.
- יצירת תבנית ( template_creation.m ) - זו משמשת כדי לקרוא לתמונות השמורות של אלפאנומריקה ואז לשמור אותן כתבנית חדשה בזיכרון MATLAB.
- זיהוי אותיות ( Letter_detection.m ) - קורא את התווים מתמונת הקלט ומצא את האלפאנומרי המתאים ביותר.
- זיהוי פלייט ( Plate_detection.m ) - עיבוד התמונה ואז התקשר לשני קבצי ה- m לעיל כדי לזהות את המספר.
כעת, נלמד כיצד לקודד קבצי m אלה ומה עליכם לעשות לפני תחילת הקידוד. לאחר שעברתם הדרכה זו, תוכלו למצוא את כל קבצי הקוד וסרטון ההסבר לעבודה בסוף פרויקט זה.
יצירת תבנית
ראשית צור תיקייה לפרויקט (שם התיקיה שלי הוא זיהוי לוחית מספר ) כדי לשמור ולאחסן את הקבצים. אחסנו את התמונות הבינאריות של כל האלפביתים והמספרים בתיקיית המשנה ששמה ' אלפא' .
כעת, פתח את חלון העורך ב- MATLAB, כפי שמוצג בתמונה למטה,
אם אינך מכיר את המינוח הבסיסי של MATLAB אני מציע לך לבדוק את ההדרכה המקושרת.
כעת, העתק והדבק את הקוד שלהלן בקובץ template_creation.m ושמור את הקובץ בתיקיית הפרויקט ( זיהוי לוחית מספר ). ניתן להוריד את כל הקבצים הקשורים לפרויקט זה כולל קבצי תבניות תמונה. בדוק גם את הסרטון שניתן בסוף פרויקט זה.
% אלפבית A = imread ('אלפא / 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 ('אלפא / X.bmp '); Y = imread ('alpha / Y.bmp'); Z = imread ('alpha / Z.bmp'); % מספרים טבעיים one = imread ('alpha / 1.bmp'); two = imread ('alpha / 2.bmp'); שלוש = imread ('אלפא / 3. bmp'); ארבע = imread ('alpha / 4. bmp'); חמש = imread ('alpha / 5.bmp'); שש = imread ('אלפא / 6. bmp'); שבע = imread ('אלפא / 7. bmp'); שמונה = imread ('אלפא / 8. bmp'); תשע = imread ('alpha / 9.bmp'); אפס = imread ('אלפא / 0. bmp'); % יצירת מערך לאותיות אלפבית =; % יצירת מערך למספרים מספרים =; NewTemplates =; שמור ('NewTemplates', 'NewTemplates') נקה הכל
כאן, בקוד לעיל אנו שומרים את התמונות למשתנה באמצעות הפקודה ' imread () '. פונקציה זו משמשת כדי לקרוא את התמונות מהתיקייה או מכל מיקום של המחשב ל- MATLAB. בואו ניקח דוגמא מהקוד לעיל:
A = imread ('אלפא / A.bmp');
כאשר A הוא המשתנה, וב- ' alpha / A.bmp' , 'alpha' הוא שם התיקיה ו- ' A.bmp' הוא שם הקובץ.
ואז ליצור מטריצה של " מכתב " ו " מספר " ולשמור אותו במשתנה " NewTemplates " באמצעות הפקודה " שמור (filename, משתנים)" .
% יצירת מערך לאותיות אלפבית =; % יצירת מערך למספרים מספרים =; NewTemplates =; שמור ('NewTemplates', 'NewTemplates') נקה הכל
עכשיו התחל בקידוד Letter_detection.m , בחלון עורך חדש.
איתור אותיות
כאן אנו יוצרים את קובץ הקוד השני בשם Letter_detection.m . כעת, העתיקו והדביקו את הקוד שלהלן באותו קובץ ושמרו את הקובץ בתיקיית הפרויקט עם השם Letter_detection. ניתן להוריד את הקובץ מכאן, קבצי ה- zip המצורפים מכילים גם קבצים אחרים הקשורים לפרויקט זיהוי לוחית מספר זה.
פונקצית אות = readLetter (snap) לטעון NewTemplates snap = imresize (snap,); rec =; עבור n = 1: אורך (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; end ind = find (rec == max (rec)); תצוגה (find (rec == max (rec))); % רישומי אלפבית. אם ind == 1 - ind == 2 אות = 'A'; elseif ind == 3 - ind == 4 letter = 'B'; elseif ind == 5 אות = '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 אות = 'אני'; 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 letter = '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 אות = 'U'; elseif ind == 29 אות = 'V'; elseif ind == 30 אות = 'W'; elseif ind == 31 אות = 'X'; elseif ind == 32 אות = 'Y'; elseif ind == 33 אות = 'Z'; % * - * - * - * - * רישומי ספרות%. elseif ind == 34 אות = '1'; elseif ind == 35 אות = '2'; elseif ind == 36 אות = '3'; elseif ind == 37 - ind == 38 letter = '4'; elseif ind == 39 אות = '5'; elseif ind == 40 - ind == 41 - ind == 42 אות = '6'; elseif ind == 43 אות = '7'; elseif ind == 44 - ind == 45 letter = '8'; elseif ind == 46 - ind == 47 - ind == 48 אות = '9'; מכתב אחר = '0'; סוף סוף
כאן, בקוד לעיל יצרנו פונקציה בשם אות אשר נותנת לנו את הפלט האלפאנומרי של תמונת הקלט מהמחלקה ' אלפא ' באמצעות הפקודה ' readLetter ()' . ואז טען את התבניות השמורות באמצעות עומס הפקודה 'NewTemplates .
לאחר מכן, שינינו את גודל תמונת הקלט כך שניתן להשוות אותה לתמונות התבנית באמצעות הפקודה 'imresize (שם קובץ, גודל)' . אז עבור לולאה משמש לתאם את תמונת הקלט עם כל תמונה בתבנית כדי לקבל את ההתאמה הטובה ביותר.
מטריצה ' rec ' נוצרת כדי להקליט את ערך המתאם לכל תבנית אלפאנומרית עם תבנית התווים מתמונת הקלט, כפי שמוצג בקוד שלהלן,
cor = corr2 (תבניות New {1, n}, snap);
ואז הפקודה 'מצא ()' משמשת לאיתור האינדקס המתאים לתו המתאים ביותר. ואז על פי אותו אינדקס, הדמות התואמת מודפסת באמצעות הצהרת 'אם-אחר' .
כעת, לאחר השלמת פעולה זו פתח חלון עורך חדש להפעלת קוד עבור התוכנית הראשית.
זיהוי לוחית מספר
הנה קובץ הקוד השלישי והאחרון בשם Plate_detection.m העתק והדבק את הקוד שלהלן בקובץ זה ושמור בתיקיית הפרויקט. להתחלה מהירה תוכלו להוריד את כל קבצי הקוד עם תבניות התמונה מכאן.
סגור הכל; נקה הכל; im = imread ('תמונות מספר לוח / image1.png'); imgray = rgb2gray (im); imbin = imbinarize (imgray); im = edge (imgray, 'prewitt'); % להלן השלבים הם למצוא מיקום של לוחית המספר Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); שטח = Iprops.Area; ספירה = מספר (Iprops); מקסא = שטח; boundingBox = Iprops.BoundingBox; עבור i = 1: ספור אם maxa
להלן פקודות בסיסיות המשמשות בקוד לעיל:
imread () - פקודה זו משמשת לפתיחת התמונה ל- MATLAB מתיקיית היעד.
rgb2gray () - פקודה זו משמשת להמרת תמונת RGB לפורמט בגווני אפור.
imbinarize () - פקודה זו משמשת לבינריזציה של תמונה דו-ממדית בגווני אפור או פשוט נוכל לומר שהיא ממירה את התמונה לפורמט שחור-לבן.
edge () - פקודה זו משמשת לאיתור הקצוות בתמונה, באמצעות שיטות שונות כמו רוברטס, סובל, פרוויט ורבים אחרים.
regionprops () - פקודה זו משמשת למדידת מאפייני אזור התמונה.
numel () - פקודה זו משמשת לחישוב מספר רכיבי המערך.
imcrop () - פקודה זו משמשת לחיתוך התמונה בגודל שהוזן.
bwareaopen () - פקודה זו משמשת להסרת אובייקטים קטנים מהתמונה הבינארית.
על ידי שימוש בפקודות לעיל בקוד, אנו קוראים לתמונת הקלט וממירים אותה לסולם האפור. ואז גווני האפור מומרים לתמונה בינארית, וקצה התמונות הבינאריות מזוהה בשיטת פרוויט.
ואז משתמשים בקוד שלמטה כדי לזהות את המיקום של לוחית המספר בתמונת הקלט כולה, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); שטח = Iprops.Area; ספירה = מספר (Iprops); מקסא = שטח; boundingBox = Iprops.BoundingBox; עבור i = 1: ספור אם maxa
לאחר מכן חתוך את לוחית המספר והסר את האובייקטים הקטנים מהתמונה הבינארית באמצעות הפקודה 'imcrop ()' ו- 'bwareaopen ()' בהתאמה.
לאחר מכן, הקוד שלהלן משמש לעיבוד אותה תמונת לוחית רישוי קצוצה ולהצגת המספר שזוהה בתבנית התמונה והטקסט (בחלון הפקודה).
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); ספירה = מספר (Iprops); noPlate =; עבור i = 1: ספירת ow = אורך (Iprops (i). תמונה (1,:)); הו = אורך (Iprops (i). תמונה (:, 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 קובץ הקוד נקרא כאשר אנו מעבדים את התמונה כפי שמוצג בתמונה למטה,
כעת לחץ על כפתור 'הפעל' כדי להריץ את קובץ ה- m
MATLAB עשויה לקחת מספר שניות להגיב, המתן עד שתראה הודעה עסוקה בפינה השמאלית התחתונה כמוצג להלן,
עם תחילת התוכנית תקבל את חלון הקופץ של תמונת לוח המספרים ואת המספר בחלון הפקודה. הפלט של התמונה שלי ייראה כמו התמונה שניתנה למטה;
עבודה מלאה של מערכת זיהוי לוחיות רישוי רכב מוצגת בסרטון להלן, ואת כל קבצי הקוד עם תבניות התמונה ניתן להוריד מכאן.
כמו כן, בדוק את כל פרויקטי MATLAB כאן.