مطابقة القوالب NCC
فيديو تعليمي 8 - مطابقة القوالب NCC:https://singtown.com/learn/49598/
خوارزمية NCC:
# مثال على مطابقة القوالب - الارتباط المتقاطع المُطبَّع (Normalized Cross Correlation - NCC)
#
# يوضح هذا المثال كيفية استخدام ميزة NCC في كاميرا OpenMV لمطابقة أجزاء من الصورة
# مع أجزاء أخرى من صورة... باستثناء البيئات المُتحكَّم بها بشكل كبير جدًا، فإن NCC
# ليست مفيدة كثيرًا.
#
# تحذير: يحتاج دعم NCC إلى إعادة عمل! في الوقت الحالي تحتاج هذه الميزة إلى الكثير
# من العمل لتصبح مفيدة. سيبقى هذا النص البرمجي لإظهار أن الوظيفة موجودة، لكنها
# في حالتها الراهنة غير كافية.
import csi
import time, csi, image
csi0 = csi.CSI()
from image import SEARCH_EX, SEARCH_DS
# استيراد SEARCH_EX وSEARCH_DS من وحدة image. استخدام from import يستورد فقط
# الجزأين المطلوبين SEARCH_EX وSEARCH_DS، دون استيراد وحدة image بأكملها.
# إعادة تهيئة الحساس
csi0.reset()
# ضبط إعدادات الحساس
csi0.contrast(1)
csi0.gainceiling(16)
# أقصى دقة لمطابقة القوالب باستخدام SEARCH_EX هي QQVGA
csi0.framesize(csi.QQVGA)
# يمكنك ضبط windowing لتقليل صورة البحث.
#csi0.window(((640-80)//2, (480-60)//2, 80, 60))
csi0.pixformat(csi.GRAYSCALE)
# تحميل القالب.
# يجب أن يكون القالب صورة صغيرة (مثلاً 32×32 بكسل) بتدرج رمادي.
template = image.Image("template.pgm")
# تحميل صورة القالب
clock = time.clock()
# تشغيل مطابقة القوالب
while (True):
clock.tick()
img = csi0.snapshot()
# find_template(template, threshold, [roi, step, search])
# ROI: منطقة الاهتمام (region of interest) كـ tuple (x, y, w, h).
# Step: خطوة الحلقة المستخدمة (y+=step, x+=step)، استخدم خطوة أكبر لجعلها أسرع.
# Search هي إما image.SEARCH_EX للبحث الشامل (exhaustive) أو image.SEARCH_DS للبحث الماسي (diamond)
#
# ملاحظة 1: يجب أن يكون ROI أصغر من الصورة وأكبر من القالب.
# ملاحظة 2: في البحث الماسي، يتم تجاهل step وROI كليهما.
r = img.find_template(template, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
# find_template(template, threshold, [roi, step, search])، حيث 0.7 في threshold
# هي عتبة التشابه، وroi هي المنطقة التي تتم فيها المطابقة (رأسها العلوي الأيسر
# هو (10، 0)، بطول 80 وعرض 60). لاحظ أن حجم roi يجب أن يكون أكبر من صورة القالب
# وأصغر من framebuffer.
# وضع علامة على الصورة المطابقة
if r:
img.draw_rectangle(r)
print(clock.fps())
لاحظ أنه نظرًا لأن حجم صورة القالب لدينا يتجاوز الذاكرة الداخلية (flash) في openmv، فنحن بحاجة إلى إدخال بطاقة SD قبل تنفيذ الخطوات التالية. (لاحظ أنه يجب عليك إدخال بطاقة SD قبل تشغيل الجهاز) ولا يمكن استخدام مطابقة القوالب هذه إلا مع إصدار البرنامج الثابت (firmware) 1.6 فما فوق، وإلا فسيظهر خطأ "can not find SEARCH_EX" أثناء التشغيل
أولاً، نحتاج إلى إنشاء أو استيراد قالب. لاحظ أن هذا القالب يجب أن يكون بصيغة pgm وله حد أقصى للحجم لا يمكن أن يتجاوز حجم البكسل في openmv. يمكننا التقاط صورة قالب مباشرة من openmv. يمكنك أولاً تشغيل روتين helloworld.py لجعل framebuffer يعرض الصورة، ثم التقاطها.

اختر خيار حفظ الصورة إلى الحاسوب. لاحظ أن الصورة الملتقطة والمحفوظة مباشرة من openmv تكون بصيغة bmp. نحتاج إلى تحويلها إلى صيغة pgm. يمكنك إجراء التحويل عبر الإنترنت على هذا الموقع https://convertio.co/zh/bmp-pgm/
بعد ذلك، نحفظ قالب pgm المحوَّل إلى بطاقة SD (توجد 8 قوالب في بطاقة SD هذه، والقالب في الصورة أعلاه محفوظ باسم ball0.pgm)

بعد ذلك نفتح روتين مطابقة القوالب

غيّر اسم ملف القالب template.pgm في السطر 28 إلى ball0.pgm الذي حصلنا عليه للتو

وشغّله مباشرة!

هذا هو استخدام دالة مطابقة القوالب find_template:

r = img.find_template(template, 0,7, roi=(10,0,80,60), step=4, search=SEARCH_EX) القيمة 0.7 في threshold هي عتبة التشابه، وroi هي منطقة المطابقة (الرأس العلوي الأيسر هو (10, 0)، الطول 80 والعرض 60). لاحظ أن حجم roi يجب أن يكون أكبر من صورة القالب وأصغر من framebuffer.
لاحظ أن مطابقة القوالب هذه تستخدم خوارزمية ncc، والتي لا يمكنها مطابقة سوى المناطق المشابهة لحجم القالب. إذا أردت مطابقة صور بأحجام مختلفة، فستحتاج إلى حفظ عدة قوالب بأحجام مختلفة.
إذا حدثت المشكلات التالية بعد تشغيل البرنامج:
- صورة القالب كبيرة جدًا، يُنصح بأن تكون صورة القالب أصغر من 80×60

- لا تحتوي OpenMV2 على ذاكرة كافية، غيّر QQVGA إلى QQCIF

مقارنة بين مطابقة القوالب والكشف عن نقاط الميزات (feature point detection):
مطابقة القوالب (find_temolate) تستخدم خوارزمية ncc، والتي لا يمكنها سوى مطابقة الأنماط التي تكون بنفس الحجم والزاوية تقريبًا كصورة القالب. القيود كبيرة نسبيًا. إذا كان النمط المستهدف في مجال الرؤية أكبر أو أصغر قليلاً من صورة القالب، فقد لا تنجح المطابقة.
تُعد مطابقة القوالب مناسبة للحالات التي تكون فيها المسافة بين الكاميرا والجسم المستهدف ثابتة ولا تتطلب حركة ديناميكية. على سبيل المثال، هي مناسبة للكشف عن أجسام محددة على خط التجميع (assembly line)، ولكنها ليست مناسبة لتتبع السيارة لكرة طائرة متحركة (لأن المسافة بين الكرة الطائرة المتحركة والكاميرا ديناميكية، وسيتغير حجم الكرة الطائرة الذي تراه الكاميرا، ولن يكون مطابقًا تمامًا لصورة القالب).
للمطابقة متعددة الزوايا والأحجام، يمكنك تجربة حفظ عدة قوالب واستخدام مطابقة القوالب المتعددة.
الكشف عن نقاط الميزات (find_keypoint): إذا بدأت للتو بتشغيل البرنامج، فإن الروتين يستخرج الصورة الأولى كميزة للجسم المستهدف، ويحفظ kpts1 ميزة الجسم المستهدف. بشكل افتراضي، سيتم مطابقة مقاييس وزوايا متعددة للميزة المستهدفة، بدلاً من حفظ حجم وزاوية الميزة المستهدفة فقط. إنه أكثر مرونة من مطابقة القوالب ولا يحتاج إلى حفظ قوالب متعددة مثل مطابقة القوالب المتعددة.
يمكن للكشف عن نقاط الميزات أيضًا حفظ الميزات المستهدفة مسبقًا. لم يكن هذا موصى به سابقًا لأن التداخل الناتج عن الإضاءة المحيطة وأسباب أخرى قد يؤدي إلى ميزات مختلفة في إضاءات مختلفة في كل مرة يتم فيها تشغيل البرنامج، مما يقلل من درجة المطابقة. ومع ذلك، في أحدث إصدار من البرنامج الثابت (firmware)، تمت إضافة ضبط التعريض الضوئي (exposure) وتوازن اللون الأبيض وقيمة الكسب التلقائي. يمكن تحديد قيمة التعريض الضوئي وقيمة توازن اللون الأبيض يدويًا، مما يقلل نسبيًا من تداخل الإضاءة. يمكنك أيضًا تجربة حفظ الميزات المستهدفة مسبقًا.