- المتطلبات المسبقة
- الخطوات المتبعة في التعرف على لوحة الترخيص باستخدام Raspberry Pi
- 1. كشف لوحة الترخيص
- 2. تجزئة الحرف
- 3. التعرف على الحروف
- حالات الفشل في التعرف على لوحة الأرقام
- أمثلة أخرى ناجحة
لطالما كان الأمن مصدر قلق كبير للبشرية. اليوم لدينا كاميرات مراقبة بالفيديو في المدارس والمستشفيات وكل الأماكن العامة الأخرى لتجعلنا نشعر بالأمان. وفقًا لمسح أجراه HIS ، يقدر أنه كان هناك حوالي 245 مليون كاميرا أمنية مثبتة وتعمل مرة أخرى في عام 2014 ، وهو ما يشبه وجود كاميرا أمنية واحدة لكل 30 شخصًا على هذا الكوكب. مع التقدم في التكنولوجيا وخاصة في معالجة الصور والتعلم الآلي ، من الممكن جعل هذه الكاميرات أكثر ذكاءً من خلال تدريبها على معالجة المعلومات من موجز الفيديو.
يمكن استخدام تدفق الفيديو من هذه الكاميرات لإجراء التعرف على الوجوه وتحليل الأنماط وتحليل المشاعر وغير ذلك الكثير مما يجعله قريبًا من شيء مثل "عين الله" المعروض في فيلم FF7. في الواقع ، بدأت شركات المراقبة مثل Hikvision والعديد من الشركات الأخرى بالفعل في تنفيذ هذه الميزات في منتجاتها. استخدمنا سابقًا معالجة صور MATLAB لقراءة لوحة الأرقام ، واليوم في هذه المقالة سوف نتعلم كيفية التعرف على رقم لوحة الترخيص وقراءته من السيارات التي تستخدم Raspberry Pi و OpenCV. سنستخدم بعض الصور العشوائية للمركبة من Google ونكتب برنامجًا للتعرف على لوحة الأرقام باستخدام OpenCV Contour Detection ثم نقرأ الرقم من اللوحة باستخدام Tesseract OCR. يبدو الأمر ممتعًا ، لذا فلنبدأ.
المتطلبات المسبقة
كما قيل سابقًا ، سنستخدم مكتبة OpenCV لاكتشاف الوجوه والتعرف عليها. لذا تأكد من تثبيت مكتبة OpenCV على Raspberry Pi قبل متابعة هذا البرنامج التعليمي. قم أيضًا بتشغيل Pi الخاص بك بمحول 2A وتوصيله بشاشة عرض لتصحيح الأخطاء بشكل أسهل.
لن يشرح هذا البرنامج التعليمي كيفية عمل OpenCV بالضبط ، إذا كنت مهتمًا بتعلم معالجة الصور ، فراجع أساسيات OpenCV والبرامج التعليمية المتقدمة لمعالجة الصور. يمكنك أيضًا التعرف على الخطوط العريضة واكتشاف النقطة الثنائية وغيرها في هذا البرنامج التعليمي لتجزئة الصور باستخدام OpenCV. سنفعل شيئًا مشابهًا لهذا لاكتشاف لوحة ترخيص السيارة من الصورة.
الخطوات المتبعة في التعرف على لوحة الترخيص باستخدام Raspberry Pi
يتضمن التعرف على لوحة الترخيص أو LPR للاختصار ثلاث خطوات رئيسية. والخطوات هي كما يلي
1. اكتشاف لوحة الترخيص: تتمثل الخطوة الأولى في اكتشاف لوحة الترخيص من السيارة. سنستخدم خيار الكنتور في OpenCV لاكتشاف الأجسام المستطيلة للعثور على لوحة الأرقام. يمكن تحسين الدقة إذا عرفنا الحجم الدقيق واللون والموقع التقريبي للوحة الأرقام. عادةً ما يتم تدريب خوارزمية الكشف بناءً على موضع الكاميرا ونوع لوحة الأرقام المستخدمة في ذلك البلد المحدد. يصبح هذا الأمر أكثر تعقيدًا إذا كانت الصورة لا تحتوي حتى على سيارة ، في هذه الحالة سنقوم بخطوة إضافية لاكتشاف السيارة ثم لوحة الترخيص.
2. تجزئة الأحرف: بمجرد اكتشاف لوحة الترخيص ، يتعين علينا قصها وحفظها كصورة جديدة. مرة أخرى يمكن القيام بذلك بسهولة باستخدام OpenCV.
3. التعرف على الحروف: الآن ، من المؤكد أن الصورة الجديدة التي حصلنا عليها في الخطوة السابقة تحتوي على بعض الأحرف (أرقام / أبجديات) مكتوبة عليها. لذلك ، يمكننا إجراء OCR (التعرف الضوئي على الأحرف) عليه لاكتشاف الرقم. لقد أوضحنا بالفعل التعرف الضوئي على الأحرف (OCR) باستخدام Raspberry Pi.
1. كشف لوحة الترخيص
تتمثل الخطوة الأولى في قارئ لوحة الترخيص Raspberry Pi في اكتشاف لوحة الترخيص. لنأخذ عينة من صورة سيارة ونبدأ باكتشاف لوحة الترخيص الموجودة على تلك السيارة. سنستخدم بعد ذلك نفس الصورة لتجزئة الأحرف والتعرف على الأحرف أيضًا. إذا كنت تريد القفز مباشرة إلى الكود بدون تفسير ، فيمكنك التمرير لأسفل إلى أسفل هذه الصفحة ، حيث يتم توفير الرمز الكامل. يتم عرض صورة الاختبار التي أستخدمها لهذا البرنامج التعليمي أدناه.
الخطوة 1: قم بتغيير حجم الصورة إلى الحجم المطلوب ثم قم بتدرجها باللون الرمادي. يتم إعطاء رمز لنفسه أدناه
img = cv2.resize (img، (620،480)) رمادي = cv2.cvtColor (img، cv2.COLOR_BGR2GRAY) # تحويل إلى مقياس رمادي
تغيير الحجم يساعدنا على تجنب أي مشاكل مع الصور ذات الدقة الأكبر ، تأكد من بقاء لوحة الأرقام في الإطار بعد تغيير الحجم. القياس الرمادي شائع في جميع خطوات معالجة الصور. يؤدي هذا إلى تسريع العمليات التالية الأخرى التي لم نعد بحاجة للتعامل مع تفاصيل اللون عند معالجة صورة. سيتم تحويل الصورة إلى شيء مثل هذا عند الانتهاء من هذه الخطوة
الخطوة 2: ستحتوي كل صورة على معلومات مفيدة وغير مفيدة ، وفي هذه الحالة بالنسبة لنا ، فإن لوحة الترخيص هي فقط المعلومات المفيدة ، أما الباقي فهي عديمة الفائدة إلى حد كبير لبرنامجنا. تسمى هذه المعلومات عديمة الفائدة الضوضاء. عادةً ما يؤدي استخدام مرشح ثنائي (Bluring) إلى إزالة التفاصيل غير المرغوب فيها من الصورة. رمز نفسه هو
الرمادي = cv2.bidedFilter (رمادي ، 11 ، 17 ، 17)
بناء الجملة هو destination_image = cv2.bidedFilter (source_image ، قطر البكسل ، sigmaColor ، sigmaSpace). يمكنك زيادة لون سيجما ومساحة سيجما من 17 إلى قيم أعلى لطمس المزيد من معلومات الخلفية ، ولكن كن حذرًا من عدم وضوح الجزء المفيد. تظهر الصورة الناتجة أدناه ، حيث يمكنك رؤية تفاصيل الخلفية (الشجرة والمبنى) غير واضحة في هذه الصورة. بهذه الطريقة يمكننا تجنب البرنامج من التركيز على هذه المناطق لاحقًا.
الخطوة 3: الخطوة التالية مثيرة للاهتمام حيث نقوم باكتشاف الحافة. هناك العديد من الطرق للقيام بذلك ، والطريقة الأكثر سهولة وشعبية هي استخدام طريقة الحافة الحاذقة من OpenCV. يتم عرض السطر للقيام بالمثل أدناه
edged = cv2.Canny (رمادي ، 30 ، 200) # أداء اكتشاف الحافة
سيكون بناء الجملة هو destination_image = cv2.Canny (source_image، thresholdValue 1، thresholdValue 2). تعد قيمة Threshold Vale 1 وقيمة Threshold 2 هي قيم الحد الأدنى والحد الأقصى. سيتم فقط عرض الحواف التي تحتوي على تدرج شدة أكبر من الحد الأدنى لقيمة الحد الأدنى وأقل من الحد الأقصى لقيمة العتبة. تظهر الصورة الناتجة أدناه
الخطوة 4: الآن يمكننا أن نبدأ في البحث عن ملامح على صورتنا ، لقد تعلمنا بالفعل كيفية العثور على ملامح باستخدام OpenCV في برنامجنا التعليمي السابق ، لذلك نواصل بنفس الطريقة.
اليلة = cv2.findContours (edged.copy ()، cv2.RETR_TREE، cv2.CHAIN_APPROX_SIMPLE) الأنابيب النانوية الكربونية = imutils.grab_contours (الأنابيب النانوية الكربونية) الأنابيب النانوية الكربونية = فرز (المركز ومفتاح = cv2.contourArea، عكس = صحيح) screenCnt = بلا
بمجرد اكتشاف العدادات ، نقوم بفرزها من كبيرة إلى صغيرة ونأخذ بعين الاعتبار النتائج العشر الأولى فقط مع تجاهل النتائج الأخرى. في صورتنا ، يمكن أن يكون العداد أي شيء له سطح مغلق ولكن من بين جميع النتائج التي تم الحصول عليها ، سيكون رقم لوحة الترخيص موجودًا أيضًا لأنه سطح مغلق أيضًا.
لتصفية صورة لوحة الترخيص من بين النتائج التي تم الحصول عليها ، سنقوم بتكرار جميع النتائج والتحقق من شكل مستطيل الشكل بأربعة جوانب وشكل مغلق. نظرًا لأن لوحة الترخيص ستكون بالتأكيد شكل مستطيل من أربعة جوانب.
# حلقة فوق معالمنا لـ c في cnts: # تقريب محيط محيط الدائرة = cv2.arcLength (c ، True) تقريبًا = cv2.approxPolyDP (c ، 0.018 * peri ، True) # إذا كان محيطنا التقريبي به أربع نقاط ، ثم # نحن يمكن أن نفترض أننا وجدنا شاشتنا إذا كانت len (تقريبًا) == 4: screenCnt = تقريبًا كسر
القيمة 0.018 هي قيمة تجريبية ؛ يمكنك اللعب حولها للتحقق مما يناسبك. أو انتقل إلى المستوى التالي باستخدام التعلم الآلي للتدريب على أساس صور السيارة ثم استخدم القيمة الصحيحة هناك. بمجرد العثور على العداد الصحيح نقوم بحفظه في متغير يسمى screenCnt ثم نرسم مربع مستطيل حوله للتأكد من أننا اكتشفنا لوحة الترخيص بشكل صحيح.
الخطوة 5: الآن بعد أن عرفنا مكان لوحة الأرقام ، فإن المعلومات المتبقية عديمة الفائدة إلى حد كبير بالنسبة لنا. لذلك يمكننا المضي قدمًا في إخفاء الصورة بأكملها باستثناء المكان الذي توجد فيه لوحة الأرقام. يظهر رمز القيام بالشيء نفسه أدناه
# إخفاء الجزء غير قناع لوحة الأرقام = np.zeros (gray.shape، np.uint8) new_image = cv2.drawContours (mask ،، 0،255، -1،) new_image = cv2.bitwise_and (img، img، mask = قناع)
ستظهر الصورة الجديدة المقنعة على النحو التالي
2. تجزئة الحرف
تتمثل الخطوة التالية في التعرف على لوحة رقم Raspberry Pi في تجزئة لوحة الترخيص من الصورة عن طريق قصها وحفظها كصورة جديدة. يمكننا بعد ذلك استخدام هذه الصورة لاكتشاف الشخصية الموجودة فيها. يظهر رمز اقتصاص صورة roi (منطقة الاهتمام) من الصورة الرئيسية أدناه
# الآن المحاصيل (x، y) = np. حيث (القناع == 255) (topx، topy) = (np.min (x)، np.min (y)) (bottomx، bottomy) = (np.max (x) ، np.max (y)) اقتصاص = رمادي
تظهر الصورة الناتجة أدناه. تتم إضافتها عادةً إلى اقتصاص الصورة ، ويمكننا أيضًا أن نحصل عليها باللون الرمادي ونضع حوافها إذا لزم الأمر. يتم ذلك لتحسين التعرف على الأحرف في الخطوة التالية. ومع ذلك ، وجدت أنه يعمل بشكل جيد حتى مع الصورة الأصلية.
3. التعرف على الحروف
تتمثل الخطوة الأخيرة في التعرف على لوحة رقم Raspberry Pi في قراءة معلومات لوحة الأرقام من الصورة المجزأة. سوف نستخدم pytesseract حزمة إلى أحرف القراءة من الصورة، تماما كما فعلنا في السابق تعليمي. يتم إعطاء رمز لنفسه أدناه
# قراءة نص لوحة الأرقام = pytesseract.image_to_string (Cropped، config = '- psm 11') print ("Detected Number is:"، text)
لقد أوضحنا بالفعل كيفية تكوين محرك Tesseract ، لذلك هنا مرة أخرى إذا لزم الأمر ، يمكننا تكوين Tesseract OCR للحصول على نتائج أفضل إذا لزم الأمر. ثم يتم طباعة الحرف المكتشف على وحدة التحكم. عند تجميع النتيجة تظهر على النحو التالي
كما ترى ، كانت الصورة الأصلية تحمل الرقم "HR 25 BR9044" وقد اكتشف برنامجنا أنها طبعت نفس القيمة على الشاشة.
حالات الفشل في التعرف على لوحة الأرقام
يمكن تنزيل ملف المشروع الكامل للتعرف على لوحة ترخيص Raspberry Pi من هنا ، وهو يحتوي على البرنامج وصور الاختبار التي استخدمناها للتحقق من برنامجنا. دون أن يقال ، يجب أن نتذكر أن نتائج هذه الطريقة لن تكون دقيقة . تعتمد الدقة على وضوح الصورة والتوجيه والتعرض للضوء وما إلى ذلك. للحصول على نتائج أفضل ، يمكنك تجربة تطبيق خوارزميات التعلم الآلي مع هذا.
للحصول على فكرة ، دعنا نلقي نظرة على مثال آخر حيث لا تواجه السيارة الكاميرا مباشرة.
كما ترى ، كان برنامجنا قادرًا على اكتشاف لوحة الترخيص بشكل صحيح واقتصاصها. لكن مكتبة Tesseract فشلت في التعرف على الشخصيات بشكل صحيح. بدلاً من "TS 08 UE 3396" الفعلي ، اعترف OCR بأنه "1508 ye 3396". يمكن تصحيح مثل هذه المشكلات إما باستخدام صور توجيه أفضل أو عن طريق تكوين محرك Tesseract .
السيناريو الأسوأ الآخر هو حيث يفشل الكفاف في اكتشاف لوحة الترخيص بشكل صحيح. تحتوي الصورة أدناه على الكثير من المعلومات الأساسية والإضاءة السيئة لدرجة أن البرنامج فشل حتى في التعرف على لوحة الترخيص من الرقم. في هذه الحالة ، يتعين علينا الاعتماد مرة أخرى على التعلم الآلي أو تحسين جودة الصورة.
أمثلة أخرى ناجحة
في معظم الأوقات تكون جودة الصورة والاتجاه صحيحًا ، تمكن البرنامج من التعرف على لوحة الترخيص وقراءة الرقم منها. تظهر اللقطات المفاجئة أدناه القليل من النتائج الناجحة التي تم الحصول عليها. مرة أخرى ، ستكون جميع صور الاختبار والرمز المستخدم هنا متاحين في ملف ZIP المقدم هنا.
آمل أن تكون قد فهمت التعرف التلقائي على لوحة الأرقام باستخدام Raspberry Pi واستمتعت ببناء شيء رائع بنفسك. ما الذي تعتقد أنه يمكن القيام به باستخدام OpenCV و Tesseract ؟ دعني أعرف أفكارك في قسم التعليقات. إذا كانت لديك أي أسئلة بخصوص هذه المقالة ، فلا تتردد في تركها في قسم التعليقات أدناه أو استخدام المنتديات للاستفسارات الفنية الأخرى.