- דרישות קדם
- שלבים המעורבים בזיהוי לוחית רישוי באמצעות פטל פטל
- 1. זיהוי לוחית רישוי
- 2. פילוח תווים
- 3. זיהוי תווים
- מקרים כושלים בזיהוי לוחית מספר
- דוגמאות מוצלחות אחרות
ביטחון תמיד דאגה גדולה לאנושות. כיום יש לנו מצלמות מעקב וידאו בבתי ספר, בבתי חולים ובכל מקום ציבורי אחר כדי לגרום לנו להרגיש בטוחים. על פי סקר שנערך על ידי HIS, ההערכה היא שהיו כ- 245 מיליון מצלמות אבטחה שהותקנו ותפקדו עוד בשנת 2014, וזה כמו שיש מצלמת אבטחה אחת לכל 30 אנשים על פני כדור הארץ. עם ההתקדמות הטכנולוגית במיוחד בעיבוד תמונה ולמידת מכונה, ניתן להפוך את המצלמות הללו לחכמות יותר על ידי הכשרתן לעבד מידע מהעדכון הווידאו.
בעזרת פיד הווידיאו מהמצלמות הללו ניתן לבצע זיהוי פנים, ניתוח דפוסים, ניתוח רגש ועוד הרבה דברים שבאמת יתקרבו למשהו כמו "עין האל" המוצג בסרט FF7. למעשה, חברות מעקב כמו Hikvision ורבות אחרות כבר החלו ליישם את התכונות הללו במוצריהן. בעבר השתמשנו בעיבוד תמונה של MATLAB לקריאת לוחית המספרים, היום במאמר זה נלמד כיצד לזהות ולקרוא מספר לוחיות רישוי ממכוניות באמצעות Raspberry Pi ו- OpenCV. נשתמש בכמה תמונות רכב אקראיות של גוגל ונכתוב תוכנית לזיהוי לוחית המספר באמצעות זיהוי מתאר של OpenCV ואז נקרא את המספר מהלוח באמצעות Tesseract OCR. נשמע מעניין נכון !, אז בואו נתחיל.
דרישות קדם
כפי שנאמר קודם אנו נשתמש בספריית OpenCV כדי לזהות ולזהות פנים. אז הקפד להתקין את ספריית OpenCV ב- Raspberry Pi לפני שתמשיך במדריך זה. הפעל גם את ה- Pi שלך עם מתאם 2A וחבר אותו לצג תצוגה לצורך איתור באגים קל יותר.
מדריך זה לא יסביר כיצד פועלת בדיוק OpenCV, אם אתה מעוניין ללמוד עיבוד תמונה, עיין ביסודות OpenCV ובהדרכות מתקדמות לעיבוד תמונה. תוכל גם ללמוד על קווי מתאר, זיהוי כתמים וכו 'במדריך זה לפילוח תמונות באמצעות OpenCV. אנו נעשה משהו דומה לזה כדי לזהות את לוחית הרישוי של המכונית מהתמונה.
שלבים המעורבים בזיהוי לוחית רישוי באמצעות פטל פטל
זיהוי לוחית רישוי או בקיצור LPR, כולל שלושה צעדים עיקריים. השלבים הם כדלקמן
1. זיהוי לוחית רישוי: השלב הראשון הוא גילוי לוחית הרישוי מהמכונית. נשתמש באופציית המתאר ב- OpenCV כדי לאתר אובייקטים מלבניים כדי למצוא את לוחית המספר. ניתן לשפר את הדיוק אם אנו יודעים את הגודל המדויק, הצבע והמיקום המשוער של לוחית המספר. בדרך כלל אלגוריתם הגילוי מאומן בהתבסס על מיקום המצלמה וסוג לוחית המספרים המשמשים באותה מדינה מסוימת. זה נהיה מסובך יותר אם בתמונה אין אפילו מכונית, במקרה זה נבצע צעד נוסף לאיתור המכונית ואז לוחית הרישוי.
2. פילוח תווים: לאחר שגילינו את לוחית הרישוי עלינו לחתוך אותו ולשמור אותו כתמונה חדשה. שוב ניתן לעשות זאת בקלות באמצעות OpenCV.
3. זיהוי תווים: כעת, התמונה החדשה שקיבלנו בשלב הקודם ודאי תכתוב עליה כמה תווים (מספרים / אלפבית). אז נוכל לבצע בו OCR (זיהוי תווים אופטי) כדי לזהות את המספר. כבר הסברנו על זיהוי תווים אופטי (OCR) באמצעות Raspberry Pi.
1. זיהוי לוחית רישוי
השלב הראשון בקורא לוחיות הרישוי של פטל זה הוא איתור לוחית הרישוי. בואו ניקח תמונה לדוגמא של מכונית ונתחיל בזיהוי לוחית הרישוי במכונית זו. נשתמש באותה תמונה גם עבור פילוח תווים וזיהוי תווים. אם ברצונך לקפוץ ישר לקוד ללא הסבר, תוכל לגלול מטה לתחתית דף זה, שם מופיע הקוד השלם. תמונת הבדיקה בה אני משתמש לצורך הדרכה זו מוצגת להלן.
שלב 1: שנה את גודל התמונה לגודל הנדרש ואז בקנה מידה אפור. הקוד עבור אותו ניתן להלן
img = cv2.resize (img, (620,480)) אפור = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) # להמיר לסולם אפור
שינוי גודל אנו עוזרים לנו להימנע מבעיות בתמונות ברזולוציה גדולה יותר, וודאו כי לוחית המספר עדיין נשארת במסגרת לאחר שינוי הגודל. קנה המידה האפור נפוץ בכל שלבי עיבוד התמונה. זה מאיץ סינוס אחר של התהליך הבא שאנחנו כבר לא צריכים להתמודד עם פרטי הצבע בעת עיבוד תמונה. התמונה תשתנה ככזו כשצעד זה נעשה
שלב 2: לכל תמונה יהיה מידע שימושי וחסר תועלת, במקרה זה מבחינתנו רק לוחית הרישוי היא המידע השימושי השאר די חסרי תועלת עבור התוכנית שלנו. מידע חסר תועלת זה נקרא רעש. בדרך כלל שימוש במסנן דו-צדדי (Bluring) יסיר את הפרטים הלא רצויים מתמונה. הקוד עבור אותו הוא
אפור = cv2.bilateralFilter (אפור, 11, 17, 17)
התחביר הוא destination_image = cv2.bilateralFilter (source_image, קוטר הפיקסל, sigmaColor, sigmaSpace). ניתן להגדיל את צבע הסיגמה ואת שטח הסיגמה מ -17 לערכים גבוהים יותר כדי לטשטש יותר מידע רקע, אך היזהר שהחלק השימושי לא יטשטש. תמונת הפלט מוצגת למטה, שכן ניתן לראות את פרטי הרקע (עץ ובניין) מטושטשים בתמונה זו. בדרך זו אנו יכולים למנוע מהתכנית להתרכז באזורים אלה בהמשך.
שלב 3: השלב הבא מעניין היכן אנו מבצעים איתור קצה. ישנן דרכים רבות לעשות זאת, הדרך הקלה והפופולארית ביותר היא להשתמש בשיטת edge edge מ- OpenCV. השורה לעשות את אותו הדבר מוצגת להלן
קצוות = cv2.Canny (אפור, 30, 200) # בצע זיהוי קצה
התחביר יהיה destination_image = cv2.Canny (source_image, thresholdValue 1, thresholdValue 2). ערך הסף 1 וערך הסף 2 הם ערכי הסף המינימליים והמקסימליים. יוצגו רק הקצוות שדרגת העוצמה שלהם גבוהה מערך הסף המינימלי ופחות מערך הסף המרבי. התמונה המתקבלת מוצגת למטה
שלב 4: כעת אנו יכולים להתחיל לחפש קווי מתאר בתדמיתנו, למדנו כבר כיצד למצוא קווי מתאר באמצעות OpenCV במדריך הקודם שלנו, כך שנמשיך באותו האופן.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours (cnts) cnts = מיון (cnts, key = cv2.contourArea, הפוך = True) screenCnt = אין
לאחר שאותרו המונים אנו ממיינים אותם מגדול לקטן ושוקלים רק את עשר התוצאות הראשונות שמתעלמות מהאחרות. בתמונה שלנו הדלפק יכול להיות כל דבר שיש לו משטח סגור אבל מכל התוצאות שהתקבלו מספר לוחית הרישוי יהיה שם מכיוון שהוא גם משטח סגור.
כדי לסנן את תמונת לוחית הרישוי בין התוצאות שהתקבלו, נעבור לולאה על כל התוצאות ונבדוק באיזה קו מתאר בצורת מלבן עם ארבעה צדדים ודמות סגורה. מאז לוחית רישוי בהחלט תהיה מלבן דמות ארבע צדדית.
# לולאה מעל קווי המתאר שלנו עבור c ב- cnts: # משוער את קו המתאר peri = cv2.arcLength (c, True) כ = cv2.approxPolyDP (c, 0.018 * peri, True) # אם לקווי המתאר המשוערים שלנו יש ארבע נקודות, אז # we יכול להניח שמצאנו את המסך שלנו אם len (בערך) == 4: screenCnt = בערך הפסקה
הערך 0.018 הוא ערך ניסיוני; אתה יכול לשחק סביב זה כדי לבדוק מה מתאים לך ביותר. או קח את זה לשלב הבא באמצעות למידת מכונה כדי להתאמן על סמך תמונות מכונית ואז השתמש בערך הנכון שם. לאחר שמצאנו את המונה הנכון אנו שומרים אותו במשתנה שנקרא screenCnt ואז מצייר סביבו תיבת מלבן כדי לוודא שגילינו את לוחית הרישוי כהלכה.
שלב 5: עכשיו, כשאנחנו יודעים איפה לוחית המספר, המידע שנותר די חסר תועלת עבורנו. אז נוכל להמשיך ולמסוך את התמונה כולה למעט המקום שבו לוחית המספר נמצאת. הקוד לעשות את אותו הדבר מוצג להלן
# מיסוך החלק שאינו מסיכת לוח המספרים = np.zeros (אפור.צורה, np.uint8) new_image = cv2.drawContours (מסכה,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = מסכה)
התמונה החדשה רעולי הפנים תופיע בערך כמו למטה
2. פילוח תווים
השלב הבא בזיהוי לוחית מספר פטל הוא פילוח של לוחית הרישוי מהתמונה על ידי חיתוך ושמירה כתמונה חדשה. לאחר מכן נוכל להשתמש בתמונה זו כדי לזהות את הדמות בה. הקוד לחיתוך התמונה (אזור עניין) לתמונה הראשית מוצג להלן
# עכשיו חיתוך (x, y) = np.where (mask == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) חתוך = אפור
התמונה המתקבלת מוצגת למטה. בדרך כלל נוסף לחיתוך התמונה, אנו יכולים גם לאפר אותה ולקצץ אותה במידת הצורך. זה נעשה כדי לשפר את זיהוי הדמויות בשלב הבא. עם זאת גיליתי שזה עובד מצוין גם עם התמונה המקורית.
3. זיהוי תווים
השלב הסופי בזיהוי לוחית מספר פטל זה הוא לקרוא בפועל את המידע על לוחית המספר מהתמונה המפולחת. נשתמש בחבילת pytesseract כדי לקרוא תווים מתוך תמונה, בדיוק כמו שעשינו במדריך הקודם. הקוד עבור אותו ניתן להלן
# קרא את טקסט לוחית המספר = pytesseract.image_to_string (חתוך, config = '- psm 11') הדפס ("המספר שזוהה הוא:", טקסט)
כבר הסברנו כיצד להגדיר מנוע Tesseract, אז כאן שוב במידת הצורך נוכל להגדיר את ה- OCR של Tesseract כדי להשיג תוצאות טובות יותר במידת הצורך. הדמות שזוהתה מודפסת לאחר מכן על המסוף. בעת הידור התוצאה מוצגת להלן
כפי שאתה יכול לראות בתמונה המקורית היה המספר "HR 25 BR9044" בתוכנה שלנו זיהתה שהיא הדפיסה את אותו הערך על המסך.
מקרים כושלים בזיהוי לוחית מספר
ניתן להוריד את קובץ הפרויקט השלם זיהוי לוחית הרישוי של Raspberry Pi מכאן, הוא מכיל את התוכנית ואת תמונות הבדיקה בהן השתמשנו כדי לבדוק את התוכנית שלנו. מבלי שנאמר, יש לזכור שהתוצאות משיטה זו לא יהיו מדויקות . הדיוק תלוי בבהירות התמונה, בכיוון, בחשיפה לאור וכו '. כדי להשיג תוצאות טובות יותר תוכלו לנסות ליישם אלגוריתמים של למידת מכונה יחד עם זה.
כדי לקבל מושג, בואו נסתכל על דוגמא אחרת שבה המכונית לא פונה ישירות למצלמה.
כפי שאתה יכול לראות, התוכנית שלנו הצליחה לזהות נכון את לוחית הרישוי ולחתוך אותה. אבל ספריית Tesseract לא הצליחה לזהות את הדמויות כראוי. במקום "TS 08 UE 3396" בפועל, ה- OCR זיהה את זה כ- "1508 ye 3396". ניתן לתקן בעיות מסוג זה על ידי שימוש בתמונות אוריינטציה טובות יותר או על ידי קביעת תצורה של מנוע Tesseract .
תרחיש נוסף במקרה הגרוע ביותר הוא שבו קווי המתאר לא מצליחים לזהות את לוחית הרישוי כהלכה. בתמונה שלמטה יש יותר מדי מידע רקע ותאורה גרועה שהתוכנית אפילו לא הצליחה לזהות את לוחית הרישוי מהמספר. במקרה זה עלינו להישען שוב על למידת מכונה או לשפר את איכות התמונה.
דוגמאות מוצלחות אחרות
ברוב הפעמים של איכות והתמצית התמונה נכונה, התוכנית הצליחה לזהות את לוחית הרישוי ולקרוא ממנה את המספר. תמונות הצילום שלהלן מראות מעט מהתוצאות המוצלחות שהתקבלו. שוב כל תמונות הבדיקה והקוד המשמש כאן יהיו זמינים בקובץ ה- ZIP המופיע כאן.
מקווה שהבנתם זיהוי אוטומטי של לוח מספרים באמצעות Raspberry Pi ונהניתם לבנות משהו מגניב לבד. מה עוד לדעתך ניתן לעשות עם OpenCV ו- Tesseract ? ספר לי על מחשבותיך בקטע ההערות. אם יש לך שאלות בנוגע למאמר זה, אל תהסס להשאיר אותן בסעיף ההערות למטה או להשתמש בפורומים לשאילתות טכניות אחרות.