كيفية تحسين التعرف على علبة كوكا كولا: خوارزمية C++

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا التعرف على علبة كوكا كولا أصعب مما يبدو

تخيل: أنت تكتب روبوتاً يجب أن يفرز القمامة تلقائياً. أو نظاماً يحسب عدد المنتجات على الرف. واحدة من أكثر المهام شيوعاً في المقابلات والمشاريع التعليمية هي التعرف على علبة كوكا كولا. قد يبدو الأمر سهلاً؟ أسطوانة حمراء زاهية مع كتابة بيضاء. لكن في الواقع، الأمر مختلف تماماً.

على Stack Overflow، جمع سؤال "Image Processing: Algorithm Improvement for 'Coca-Cola Can' Recognition" آلاف المشاهدات وعشرات الإجابات. كافح المبرمجون لحل المشكلة: كيف نميز بشكل موثوق العلبة عن الأشياء الحمراء الأخرى (طفاية حريق، كوب أحمر، قطعة بلاستيك) في ظروف إضاءة مختلفة؟

في هذه المقالة، لن نقدم فقط كوداً جاهزاً بلغة C++ باستخدام OpenCV. بل سنشرح خطوة بخطوة خوارزميات معالجة الصور التي تحول دفق الفيديو الخام إلى تعرف واثق. ستتعلم كيفية تحسين دقة الكشف، وتجنب النتائج الإيجابية الخاطئة، وكتابة كود يعمل في الوقت الفعلي.



المشكلة: لماذا لا تعمل الطرق البسيطة

الخطأ النموذجي للمبتدئين هو محاولة العثور على الكائن بناءً على اللون فقط. على سبيل المثال، تحديد كل البكسلات الحمراء والعثور على أكبر محيط بينها. لكن:

  • الإضاءة تتغير — يبدو اللون الأحمر تحت ضوء النهار وتحت الشمس مختلفاً.
  • الانعكاسات على المعدن — تعكس العلبة الضوء، وقد يبدو لونها أبيض أو برتقالياً.
  • الخلفية مشوشة — القمصان الحمراء والكراسي واللوحات الإعلانية تربك الكاشف.
  • الشكل يتشوه — قد تكون العلبة مدورة أو مغطاة جزئياً أو مشوهة.

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



هيكل الحل: من البكسلات إلى القرار

سنبني خط أنابيب من ثلاث مراحل:

  1. المعالجة المسبقة — التمويه، التحويل إلى HSV، التشكل المورفولوجي.
  2. التجزئة — تحديد المرشحين بناءً على اللون والمحيطات.
  3. التحقق — التصفية بناءً على نسبة الأبعاد، المساحة، خصائص الملمس.

يُستخدم هذا النهج في الرؤية الحاسوبية بلغة C++ للمهام الصناعية — من فرز الأجزاء إلى مراقبة الجودة.



الخطوة 1: ترشيح الألوان في HSV

الخطوة الأولى والأكثر أهمية هي تحويل الصورة من RGB إلى HSV (Hue, Saturation, Value). لماذا؟ لأن HSV يفصل اللون (الصبغة) عن السطوع. هذا يسمح بتحديد نطاق للون الأحمر يعمل تحت إضاءة مختلفة.

#include <opencv2/opencv.hpp>using namespace cv;

Mat hsv, mask;cvtColor(src, hsv, COLOR_BGR2HSV);

// نطاق اللون الأحمر (فترتان بسبب دورية HSV)Scalar lower_red1 = Scalar(0, 70, 50);Scalar upper_red1 = Scalar(10, 255, 255);Scalar lower_red2 = Scalar(170, 70, 50);Scalar upper_red2 = Scalar(180, 255, 255);

Mat mask1, mask2;inRange(hsv, lower_red1, upper_red1, mask1);inRange(hsv, lower_red2, upper_red2, mask2);mask = mask1 | mask2;

لاحظ: اللون الأحمر يقع على حدود HSV (0 و 180 درجة)، لذلك نحتاج إلى فترتين. المعاملات Saturation (70) و Value (50) تستبعد البكسلات الباهتة جداً أو الداكنة جداً.



الخطوة 2: التشكل المورفولوجي والبحث عن المحيطات

بعد القناع، نحصل على صورة ثنائية، لكنها تحتوي على ضوضاء. نطبق الإغلاق المورفولوجي (closing) لملء الثقوب داخل العلبة، والفتح (opening) لإزالة النقاط الصغيرة.

Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));morphologyEx(mask, mask, MORPH_CLOSE, kernel);morphologyEx(mask, mask, MORPH_OPEN, kernel);                

المدونات

توصيات الكتب