استخدام شجرة ثنائية بسرعة مع التعداد باستخدام التعرف الضوئي على الحروف كمثال

كان الهدف هو إنشاء تطبيق mac يمكنه التعرف على الكود من الصور ومقاطع الفيديو.

أردت التأكد من أنه حتى مع وجود كمية كبيرة من الشفرات ، تم التعرف على النص في أقل من ثانية.

ومما يسهل المشكلة أن اللغة التي تُكتب بها الشفرة هي دائمًا اللغة الإنجليزية والعرض بين جميع الحروف هو نفسه (الخط الأحادي المسافة) - يتم استخدامها في البرمجة ، وفي هذه الخطوط يسهل رؤية الفرق بين 1 و I و 0 و O ، إلخ.

باختصار ، تنقسم المهمة إلى قسمين:

1. العثور على الرسالة نفسها بحدودها


وقام Vision ، وهو إطار عمل Apple الجديد ، بعمل رائع فيه.

فيما يلي لقطة عن كيفية عملها.


2. التعرف على الخطاب في الحدود المعطاة


قررت عدم الذهاب بطريقة صعبة والتحقق من بعض وحدات البكسل في المربع ، داخل الحدود التي توجد بها حروف (دعنا نقول: الوسط ، الزوايا ، الجوانب) ، وبدءًا من وجود أو عدم وجود خطاب ، قم بتصنيف ماهية الرسالة.

مثال توضيحي:



وهنا ما ستبدو الشجرة
هذا جزء لأن كل شيء لن يصلح ، وليس ضروريًا.


كيف تنقل هذا الرسم التخطيطي إلى الكود ، حتى لا تحفر فيه ، بحيث يكون واضحًا تمامًا؟!

هذا هو المكان الذي تأتي فيه شجرة ثنائية للإنقاذ. هنا هو الإطار الخاص به.

enum Tree<Node, Result> { ///Empty result case empty ///Result with generic type case r(Result) ///Recursive case with generic tree indirect case n(Node, Tree<Node, Result>, Tree<Node, Result>) } 

الآن ، بناءً على ذلك ، يمكننا نقل الرسم بالكامل إلى الشفرة.

 //.c ,       ,   "H"    "O" //  .c   ,     let HorOTree = TreeOCR.n(.c, .r("H"), .r("O")) 

هكذا تبدو قطعة الخشب أكبر.



يمكنك تحليل كل شيء بشكل تخطيطي وبسهولة العثور على الرسالة التي تحتاجها.

وفي اللحظة الأخيرة ، هذا هو الشكل الذي يظهر به النموذج نفسه ، والذي يحدث فيه كل العمل.

 extension Tree where Node == OCROperations, Result == String { func find(_ colorChecker: LetterExistenceChecker, with frame: CGRect) -> String? { switch self { case .empty: return nil case .r(let element): return element case let .n(operation, left, right): let exist = operation.action(colorChecker, frame) return (exist ? left : right).find(colorChecker, with: frame) } } } 

في هذه الشجرة ، نمرر فئة LetterExistenceChecker ، المسؤولة عن التحقق من وجود بكسل لرسالة في نقطة محددة داخل حدود المربع المطلوب. بالطبع ، لقد حذفت الكثير من التفاصيل ، وإلا فإن المقالة ستكون مرهقة للغاية. وهنا ، ليس فقط هاتان المرحلتان اللتان تم ذكرهما في المقالة ، بل أكثر من ذلك بكثير ، لكن تم حذفهما ، لأن الهدف كان إظهار كيفية استخدام الشجرة الثنائية والتعداد.

إليك عرض توضيحي لكيفية عمل البرنامج ، يرجى ملاحظة أنه نظرًا لأن الهدف هو التعرف على نص فقط برمز ، فقد قررت فقط تجاهل كل ما تبقى من النص غير رمز ، بحيث سيبحث البرنامج عن نص برمز فقط.


سأكون سعيدا لسماع تعليقاتكم ، النقد.

Source: https://habr.com/ru/post/ar439324/


All Articles