5.30. مطابقة القوالب

الكواشف التي تناولناها حتى الآن تجيب عن أسئلة حول محتوى إطار واحد: أين توجد الكتل، وأين تمتد الخطوط، وما الذي يقوله رمز مطبوع. وهناك صنف مختلف من الأسئلة يقارن صورة بأخرى. هل تبدو هذه المنطقة من الإطار الملتقط مثل الرقعة المرجعية التي خزّنتها وقت المعايرة؟ تجيب طرق المطابقة عن هذا السؤال.

قدّم التحليل اللوني والإحصائي الطريقة get_similarity() للسؤال المتصل -- ما مدى تشابه هاتين الصورتين المتساويتين في الحجم إجمالاً؟ -- مستخدماً SSIM كمقياس أساسي. أما سؤال المطابقة المتبقي فهو سؤال تحديد الموقع: ليس "ما مدى تشابه هاتين الصورتين" بل "أين تظهر تلك الرقعة الأصغر داخل هذه الصورة الأكبر؟" والأداة المناسبة لسؤال تحديد الموقع هي مطابقة القوالب.

5.30.1. الاستدعاء الأساسي

تبحث الطريقة find_template() عن أول موضع يظهر فيه قالب صورة صغير داخل الإطار الملتقط. يستخدم التنفيذ الارتباط التبادلي المعيّر (NCC): ينزلق القالب عبر الإطار، وتُحسب درجة المطابقة لكل موضع من الارتباط بين بكسلات القالب وبكسلات الإطار الكامنة تحتها (معيّرةً مقابل المتوسطات والتباينات المحلية بحيث لا تخدع تغيرات الكسب المطابقة)، ويُعاد أول موضع تتجاوز درجته threshold بوصفه مربع إحاطة:

template = image.Image("/sdcard/template.bmp", copy_to_fb=False)
template.to_grayscale()

match = img.find_template(template, threshold=0.7,
                           search=image.SEARCH_DS)

if match is not None:
    img.draw_rectangle(match, color=(255, 0, 0))

تعمل الطريقة على الصور بتدرج الرمادي فقط. التقط بتدرج الرمادي (الخيار الطبيعي لأي كاميرا دون مستشعر ألوان)، أو حوّل في المكان عبر to_grayscale() قبل الاستدعاء. وينطبق الأمر ذاته على القالب المحمّل من القرص: يُحوّل القالب الملوّن بالطريقة نفسها، والنتيجة هي ما يتوقعه المُطابق.

threshold عدد عشري من 0.0 إلى 1.0. تتطلب القيمة 1.0 مطابقة مثالية بكسلاً ببكسل (وهو ما لا يحدث أبداً مع الصور الملتقطة الواقعية)، وتقبل القيمة 0.0 أي شيء، والقيم بين 0.6 و 0.8 تغطي الحالة الشائعة حيث التُقط القالب في إضاءة مشابهة ولم يتغير المشهد تغيراً جذرياً. ارفع العتبة لكبح النتائج الإيجابية الزائفة؛ واخفضها لقبول المطابقات الأكثر ضوضاءً على حساب مزيد من الإصابات الزائفة.

5.30.2. استراتيجية البحث

يختار search بين استراتيجيتين. image.SEARCH_EX هو البحث الشامل: ينزلق القالب عبر كل موضع بمقدار step بكسل في الإطار ويُعيد أول إصابة فوق العتبة. أما image.SEARCH_DS فهو البحث الماسي: يأخذ المُطابق عينات خشنة أولاً، ثم يُحسّن حول أفضل درجة، وهو أسرع كثيراً لكنه قد يفوّت مطابقة حقيقية إن صادف المرور الخشن أن نزل قرب حد أقصى محلي يتفوق على الحد الأقصى العام. بالنسبة لمسار معالجة فوري حيث يكون القالب محدداً جيداً ومن غير المرجح الخلط بينه وبين غيره، يكون SEARCH_DS هو الافتراضي الصحيح؛ أما بالنسبة لمعايرة لمرة واحدة حيث تكلفة الفوات أعلى من تكلفة مسح أبطأ، فإن SEARCH_EX أكثر أماناً.

يتحكم step بتخطي البكسل أثناء المرور الشامل (يدير البحث الماسي خطوته الخاصة). تسرّع قيم step الأكبر المسح على حساب دقة دون البكسل. يقيّد roi البحث في منطقة من الإطار، مضيّقاً ما يأخذه المُطابق في الحسبان ومقلّلاً العمل في آن واحد.

القيمة المُعادة هي صفّ مربع إحاطة (x, y, w, h) يحدد أفضل مطابقة، أو None إن لم يتجاوز أي موضع العتبة. يندرج مربع الإحاطة مباشرة في draw_rectangle() أو crop() للمرحلة التالية من المعالجة.

5.30.3. فخ المقياس والدوران

المزلق التقليدي مع مطابقة القوالب هو الحساسية للمقياس والدوران. يقارن المُطابق القالب بالإطار بكسلاً ببكسل؛ فالقالب الملتقط على مسافة معينة لا يطابق الكائن نفسه الملتقط على مسافة مختلفة، والقالب الملتقط بشكل مباشر لا يطابق الكائن نفسه مرئياً من زاوية مائلة. تهبط العتبة بهدوء دون مستوى المطابقة حتى عندما يكون الكائن مرئياً بوضوح للعين البشرية، وتُعيد الطريقة None.

توجد بضعة حلول بديلة للحالات البسيطة. يمكن للتطبيق التقاط عدة قوالب بمقاييس مختلفة وتشغيل find_template() لكل منها بالتتابع، قابلاً أول واحد يتجاوز العتبة؛ وتتناسب التكلفة مع عدد القوالب. ويمكن للتطبيق معالجة الإطار مسبقاً عبر rotation_corr() أو التحويل القطبي (التحويلات الهندسية) لإزالة الدوران المخالف قبل تشغيل المطابقة؛ على أن القالب المُطابق لا يزال عليه أن يطابق الهندسة المصححة.

ثمة اصطلاح مفيد لمسارات فحص ضمان الجودة يقرن مُطابق القوالب بمُقيّم التشابه الذي قدّمه التحليل اللوني والإحصائي: تحدد find_template() موضع القطعة في الإطار الملتقط ويُقتطع مربع الإحاطة المُعاد ويُمرّر إلى get_similarity() مقابل الرقعة المرجعية. تقرر خطوة مطابقة القالب أين توجد القطعة؛ وتقرر خطوة درجة التشابه ما إذا كانت القطعة مقبولة. تعمل الخطوتان في كل إطار، وتكون العتبة على mean بوابة النجاح/الفشل، ويكون مربع الإحاطة المُطابق المرسوم مجدداً في الإطار هو معاينة OpenMV IDE التي يراقبها المشغّل.