إذا كنت من محبي هاري بوتر، فستعرف ما هي عباءة الإخفاء Invisibility Cloak. نعم! إنها العباءة التي يستخدمها هاري بوتر ليصبح غير مرئي.
بالطبع، نعلم جميعًا أن عباءة الاخفاء ليست حقيقية، نعرف جيدا إنها خدعة. ولكن هل كان لديك من قبل خيال في طفولتك لاستخدام هذه العباءة؟!.
ابشرك فيك أن تجربها وترتديها والآن!!.
في هذا المنشور ، سوف تتعلم كيفية إنشاء عباءة الإخفاء الخاصة بك ببساطة باستخدام تقنيات رؤية الكمبيوتر في OpenCV.
هل تحمست؟! انها بضع خطوات بسيطة..
حسنًا، يمكنك إنشاء هذه التجربة السحرية باستخدام تقنية معالجة الصور تسمى اكتشاف الألوان والتجزئة. كل ما تحتاجه هو قطعة قماش حمراء اللون واتبع هذا المنشور.
شاهد هذا الفيديو أدناه حيث أحاول استخدام عباءة الاخفاء الخاصة بي!
كيف يعمل ؟
سنستخدم قطعة قماش حمراء اللون كعباءة. وربما تتسآل لماذا اللون الأحمر؟ لماذا لا يكون أخضر أو أزرق؟ .
بالتأكيد، بإمكاننا استخدام اللون الأخضر أو الأزرق،أو أي لون آخر، ستعمل هذه الألوان أيضًا بشكل جيد مع القليل من التغيير والتبديل في الكود.
الفكرة الأساسية والخطوات كالتالي:
- التقاط وتخزين إطار الخلفية
- اكتشاف قطعة القماش ذات اللون الأحمر باستخدام خوارزمية الكشف عن اللون.
- تجزئة قطعة القماش ذات اللون الأحمر عن طريق إنشاء قناع mask.
- إنشاء الإخراج output المعزز النهائي لإنشاء التأثير السحري.
الخطوة 1: التقاط وتخزين إطار الخلفية
كما هو موضح أعلاه ، فإن الفكرة الأساسية هي استبدال وحدات البكسل الحالية للإطار المقابل للقماش بوحدات البكسل في الخلفية background لتوليد تأثير عباءة الإخفاء . لهذا ، نحتاج إلى تخزين إطار الخلفية background.
في الكود أعلاه ، تمكننا طريقة cap.read () من التقاط أحدث إطار (يتم تخزينه في “background”) باستخدام الكاميرا ، كما أنها تُرجع قيمة (True / False مخزنة في ” ret” ). إذا تمت قراءة الإطار بشكل صحيح ، فسيكون True.
لماذا يتم التقاط صورة الخلفية باستخدام “for loop”؟
بما أن الخلفية ثابتة ، ألا يمكننا ببساطة استخدام إطار واحد؟ بالتأكيد ، لكن الصورة الملتقطة مظلمة قليلاً مقارنة بصورة ذات إطارات متعددة. هذا لأن الكاميرا بدأت للتو في التقاط الإطارات ، وبالتالي فإن معلماتها ليست مستقرة بعد. وبالتالي ، فإن التقاط صور متعددة للخلفية الثابتة باستخدام حلقة for يفي بالغرض.
ويؤدي أيضًا وضع المتوسط على إطارات متعددة إلى تقليل الضوضاء.
الخطوة الثانية: اكتشاف اللون الأحمر
نظرًا لأننا نستخدم قطعة قماش حمراء اللون لتحويلها إلى عباءة غير مرئية ، فسنركز على اكتشاف اللون الأحمر في الإطار.
يبدو بسيطا؟ لدينا صورة RGB (أحمر-أخضر-أزرق) ويمكن ببساطة تحديد قناة R والحصول على قناعنا. لكن اتضح أن هذه الطريقة لن تعمل بشكل فعال لأن قيم RGB حساسة للغاية للإضاءة. فعلى الرغم من أن العباءة ذات لون أحمر ، فقد تكون هناك بعض المناطق حيث تكون قيم القناة الحمراء لوحدات البكسل المقابلة منخفضة جدًا بسبب الظل.
النهج الصحيح هو تحويل مساحة لون صورتنا من RGB إلى HSV (تدرج اللون – التشبع – القيمة) أو (Hue – Saturation – Value).
ما هي مساحة اللون HSV؟
تمثل مساحة اللون HSV الألوان باستخدام ثلاث قيم
- Hue : هذه القناة تشفير المعلومات لون اللون. يمكن التفكير في تدرج اللون بزاوية حيث يتوافق 0 درجة مع اللون الأحمر ، و 120 درجة يتوافق مع اللون الأخضر ، و 240 درجة يتوافق مع اللون الأزرق.
- Saturation : ترمز هذه القناة كثافة / نقاء اللون. على سبيل المثال ، اللون الوردي أقل تشبعًا من اللون الأحمر.
- Value : تقوم هذه القناة بترميز سطوع اللون. تظهر مكونات التظليل واللمعان للصورة في هذه القناة.
على عكس RGB الذي تم تعريفه فيما يتعلق بالألوان الأساسية ، يتم تعريف HSV بطريقة مشابهة لكيفية إدراك البشر للون.
بالنسبة لتطبيقنا ، تتمثل الميزة الرئيسية لاستخدام مساحة اللون HSV في color/tint/wavelength ويتم تمثيله بواسطة مكون Hue فقط .
لذلك عندما أقول ، أحتاج إلى لون معين أحدد مكون hue ، ثم بناءً على مكون saturation ، أحصل على ظلال مختلفة من هذا اللون ، واعتمادًا على مكون value ، أحصل على كثافة مختلفة من ظل معين للون.
في الكود أدناه ، نلتقط أولاً إطارًا حيًا ، ونحول الصورة من RGB إلى مساحة ألوان HSV ثم نحدد نطاقًا معينًا من قيم HSV لاكتشاف اللون الأحمر.
تقوم وظيفة inRange ببساطة بإرجاع قناع ثنائي binary mask، حيث تمثل وحدات البكسل البيضاء (255) وحدات البكسل التي تقع في نطاق الحد العلوي والسفلي بينما لا تقوم وحدات البكسل السوداء (0) بذلك.
و Hue values توزع في الواقع في أكثر من دائرة (تتراوح ما بين 0-360 درجة) .وفي مكتبة OpenCV لتناسب قيمة 8bit يكون النطاق 0-180. يتم تمثيل اللون الأحمر بقيم 0-30 وكذلك قيم 150-180.
نستخدم النطاق 0-10 و170-180 لتجنب اكتشاف الجلد كلون الأحمر. يتم استخدام النطاق العالي من 120-255 للتشبع saturation لأن قماشنا يجب أن يكون عالي التشبع باللون الأحمر. النطاق الأدنى للقيمة هو 70 حتى نتمكن من الكشف عن اللون الأحمر في تجاعيد القماش أيضًا.
mask1 = mask1 + mask2
باستخدام السطر أعلاه ، نقوم بدمج الأقنعة التي تم إنشاؤها لكل من نطاق اللون الأحمر. إنها تقوم بشكل أساسي بعملية OR pixel-wise. وهو مثال بسيط على overloading +.
الآن بعد أن فهمت كيفية إجراء اكتشاف الألوان ، يمكنك تغيير نطاق HSV واستخدام قطعة قماش أخرى أحادية اللون mono-color بدلاً من اللون الأحمر. في الواقع ، ستعمل قطعة القماش الخضراء بشكل أفضل من القماش الأحمر لأن اللون الأخضر هو الأبعد عن لون بشرة الإنسان.
الخطوة 3: تجزئة قطعة القماش ذات اللون الأحمر المكتشفة
في الخطوة السابقة ، قمنا بإنشاء قناع لتحديد المنطقة في الإطار المقابل للون المكتشف. نقوم بتحسين هذا القناع ثم استخدامه لفصل القماش عن الإطار. يوضح الكود أدناه كيف يتم ذلك.
الخطوة 4: توليد الناتج المعزز النهائي لخلق تأثير سحري.
أخيرًا ، قمنا باستبدال قيم البكسل لمنطقة اللون الأحمر المكتشفة بقيم البكسل المقابلة للخلفية الثابتة وأخيراً ننتج ناتجًا معززًا يخلق التأثير السحري ، ويحول القماش إلى عباءة غير مرئية. للقيام بذلك ، نستخدم bitwise_and العملية أولاً لإنشاء صورة بقيم البكسل ، المقابلة للمنطقة المكتشفة ، مساوية لقيم البكسل للخلفية الثابتة ثم نضيف الإخراج إلى الصورة (res1) التي قمنا بتجزئة اللون الأحمر منها قماش.
أنت الآن جاهز لإنشاء عباءة الاخفاء الخاصة بك. استمتع بالتجربة السحرية.