صنع Zoetrope قطع الليزر مع المعالجة و Kinect - 💡 Fix My Ideas

صنع Zoetrope قطع الليزر مع المعالجة و Kinect

صنع Zoetrope قطع الليزر مع المعالجة و Kinect


مؤلف: Ethan Holmes, 2019

يوضح لك هذا الكودكس كيفية إنشاء zoetrope ماديًا باستخدام المعالجة و Kinect وقاطع الليزر. سيتم تحميل الرسم في فيلم مسجل من كاميرا عمق Kinect ، ويستخدم مكتبة معالجة OpenCV لتحويل هذا الفيلم إلى سلسلة من الخطوط العريضة ، وحفظ الخطوط العريضة في شكل متجه كملف DXF يمكن إرساله إلى قاطع ليزر. سأشرح أيضًا تصميم آلية المشاهد التي تعطي zoetrope دورته.

حول Zoetropes

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

في الآونة الأخيرة ، بدأ الناس في معرفة كيفية تحقيق نفس الوهم بأشياء ثلاثية الأبعاد. يقوم الفنان غريغوري برساميان ببناء منحوتات تدور أمام الأضواء المبهرة من أجل إنتاج وهم الحركة. تتكون المنحوتات من سلسلة من الكائنات المختلفة في مراحل مختلفة من الحركة ، وتعمل الأضواء الضعيفة مثل الشقوق الموجودة في zoetrope لإنشاء وهم الحركة (قد يكون Barsamian مألوفًا لدى بعض المشجعين من تغطيتنا السابقة: Gregory Barsamian's Persistence Of Vision) .

التقطت Pixar مؤخرًا الحيلة لإنشاء zoetrope مادية لوبيها. كان القائمون على الرسوم المتحركة مقتنعين بأن zoetrope المادية هي عرض لا مثيل له لمبدأ الرسوم المتحركة: تحويل سلسلة من الصور الثابتة إلى صور متحركة:

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

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

هيا بنا نغطس

تسجيل فيلم العمق

أول ما عليك فعله هو تنزيل مكتبة Kinect في Dan Shiffman للمعالجة ووضعها في مجلد مكتبات المعالجة. إذا لم تكن على دراية بكيفية القيام بذلك ، فقد حصل دان على إرشادات واضحة واضحة على صفحة مكتبة Kinect.

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

نقاش

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

في الإعداد ، قمنا بتعيين معدل الإطار على 24 بحيث يتطابق مع الفيلم الذي نسجله. نقوم أيضًا بتهيئة الرسم ليصبح 640 في 480 لتتناسب مع حجم صورة الفيديو التي ستأتي من Kinect. نقوم ببعض الإعداد Kinect الأساسي: أخبر كائن kinect الخاص بنا لبدء قراءة البيانات من الجهاز وتمكين الصورة العمق. بعد ذلك ، نهيئ فئة MovieMaker ، ونمنحها إعداد جودة ونوع ملف واسم ملف. يمكنك قراءة المزيد حول كيفية عمل MovieMaker في وثائق المعالجة. من المهم أن يطابق معدل الإطارات الذي نمرره إلى MovieMaker معدل الرسم بحيث يتم عرض فيلمنا بالسرعة المناسبة.

لدينا وظيفة التعادل بسيطة بشكل لا يصدق. كل ما نفعله هو استدعاء kinect.getDepthImage () ورسم إخراج ذلك إلى رسمنا باستخدام دالة معالجة الصورة (). سيُظهر لنا ذلك الصورة الرمادية التي تمثل خريطة العمق التي يستخرجها Kinect من المشهد. ستكون هذه صورة بالأسود والأبيض حيث لا يتوافق لون الرمادي لكل بكسل مع لون ضوء الكائن ولكن إلى أي مدى كان بعيدًا عن Kinect. سيكون للكائنات الأقرب وحدات بكسل أخف ، وستصبح الكائنات البعيدة أغمق. في وقت لاحق ، سنتمكن من معالجة وحدات البكسل هذه من أجل انتقاء كائنات على عمق معين لصورة ظلية لدينا.

الآن وبعد أن رسمنا الصورة العميقة على الشاشة ، كل ما يتعين علينا القيام به هو التقاط النتيجة في إطار جديد من الفيلم الذي نسجله (mm.addFrame ()). آخر التفاصيل المهمة للرسم هي أننا نستخدم الأحداث الرئيسية لمنحنا وسيلة لإيقاف الفيلم واستكماله. عندما يضرب شخص ما المسافة ، يتوقف الفيلم عن التسجيل وحفظ الملف. أيضًا ، يجب أن نتذكر القيام ببعض عمليات تنظيف Kinect عند الخروج وإلا فإننا سنواجه بعض الأخطاء غير المرغوب فيها كلما توقفنا عن الرسم.

فيما يلي مثال لما يبدو عليه الفيلم المسجل في هذا المخطط:

الآن ، إذا لم يكن لديك Kinect ، أو كنت تواجه مشكلة في تسجيل فيلم عميق ، فلا تيأس! لا يزال بإمكانك اللعب مع الخطوة التالية. يمكنك تنزيل فيلم عمق لي وهو يقوم بالقفز مباشرة من Vimeo: Kinect Test Movie لـ Laser Zoetrope. لقد حمّلت أيضًا فيلم العمق الذي استخدمته في zoetrope الليزرية النهائية الموضحة أعلاه إذا كنت تريد متابعتها تمامًا: Kinect Depth Test Movie. يعرض هذا الفيلم اللاحق زاك ليبرمان ، فنان وقراصنة في نيويورك وواحد من مؤسسي OpenFrameworks ، ابن عم من معالجة C ++.

إنشاء ملف الليزر القاطع

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

لإنجاز هذه الأشياء ، سنستخدم مكتبة المعالجة OpenCV ووظيفة startRaw () المدمجة في المعالجة. قم بإنشاء رسم معالجة جديد ، واحفظه ، وقم بإنشاء مجلد "بيانات" داخل مجلد الرسم ، وانقل فيلم العمق الخاص بك إلى هناك (المسمى "test_movie.mov") ، وقم بلصق شفرة المصدر التالية في الرسم (أو قم بتنزيله من ملف lasercut_zoetrope_generator.pde):

نقاش

إذا قمت بتشغيل هذا المخطط مع فيلم الاختبار الثاني الذي ربطته أعلاه ، فسوف ينتج عنه الإخراج التالي:

... وسيحفظ أيضًا ملفًا يسمى "full_output.dxf" في مجلد الرسم. هذا هو ملف المتجه الذي يمكننا جلبه إلى Illustrator أو أي برنامج تصميم آخر للمعالجة النهائية لإرساله إلى قاطع الليزر.

الآن ، دعونا نلقي نظرة على الكود.

أثناء الإعداد ، نقوم بتحميل ملف test_movie.mov إلى OpenCV ، وهو أمر يجب أن يكون مألوفًا من المشاركات السابقة على OpenCV. كما نطلق على startRaw () ، وهي وظيفة معالجة لإنشاء ملفات متجهة. سيتسبب startRaw () في أن يقوم رسمنا بتسجيل جميع مخرجاته في ملف متجه جديد حتى ندعو endRaw () ، وبهذه الطريقة يمكننا إنشاء ملفنا عبر تكرارات متعددة من حلقة السحب. في هذه الحالة ، نقوم بإنشاء ملف DXF بدلاً من PDF لأن هذا التنسيق أسهل في معالجة الليزر الذي يحتاج إلى خطوط مستمرة لإنتاج إخراج موثوق. تميل ملفات PDF التي تنتجها المعالجة إلى امتلاك العديد من مقاطع الخطوط المنفصلة التي يمكن أن تسبب نتائج غير تقليدية عند قطعها بالليزر ، بما في ذلك المهام البطيئة وسمك غير متساو.

الآن ، قبل أن نغوص في طريقة السحب ، قليلاً عن النهج. نريد سحب 12 إطارًا مختلفًا من فيلمنا ، مما يجعل إطارات جيدة للرسوم المتحركة الخاصة بنا. ثم نريد أن يقوم OpenCV باستخراج الخطوط العريضة الخاصة بهم (أو "الكنتور" في لغة OpenCV) ، وأخيرًا نريد رسم تلك الموجودة في شبكة عبر الشاشة حتى لا تتداخل وسوف يحتوي ملف DXF النهائي على جميع إطارات حيوية.

يتعامل هذا المخطط مع هذه المشكلات عن طريق إنشاء متغير "currentFrame" يتم تعريفه خارج حلقة السحب. بعد ذلك ، في كل حلقة من حلقات السحب ، يزداد هذا المتغير ونستخدمه في عمل كل ما نحتاج إليه: القفز إلى الأمام في الفيلم ، والتنقل إلى منطقة مختلفة من الرسم لرسم ، إلخ. أخيرًا ، بمجرد أن عند الانتهاء من رسم جميع الإطارات الـ 12 على الشاشة ، ندعو "endRaw ()" لإكمال ملف DXF ، تمامًا كما أطلقنا "mm.finish ()" في المخطط الأول لإغلاق ملف الفيلم.

لذلك ، بالنظر إلى هذا الهيكل العام ، كيف يمكننا رسم المحيط لكل إطار؟ دعونا نلقي نظرة على الكود:

opencv.jump (0.3 + map (currentFrame * timeBetweenFrames، 0، 9، 0، 1))؛ opencv.read ()؛

هذا يخبر OpenCV بالقفز للأمام في الفيلم بمقدار معين من الوقت. 0.3 هي نقطة الانطلاق للإطارات التي سنستحوذ عليها ، وهي شيء اكتشفته بواسطة التخمين والتحقق. لقد جربت مجموعة من القيم المختلفة ، وقمت بتشغيل المخطط في كل مرة وشاهدت الإطارات التي انتهى بي الأمر والحكم على ما إذا كانت ستقوم بعمل رسوم متحركة جيدة. يمثل "0.3" وقت البدء هذا بالثواني.

نريد أن تكون جميع إطاراتنا متباعدة بشكل متساوٍ حتى يتم تشغيل الرسوم المتحركة لدينا بشكل نظيف. لتحقيق ذلك ، نضيف مبلغًا متزايدًا إلى قفزنا البالغ 0.3 استنادًا إلى الإطار الذي نحن عليه. بمجرد حساب الوقت المناسب ، نقرأ إطار الفيلم باستخدام "opencv.read ()"

تستخدم الأسطر القليلة التالية عامل التشغيل modulo ("٪") مع رقم الإطار الحالي من أجل رسم الإطارات في أربعة إلى ثلاثة شبكة. ثم ، هناك اتصال OpenCV بسيط المظهر رائع بالفعل بالنظر إلى السياق:

opencv.threshold (150)؛

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

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

الأسطر القليلة التالية ، والملفوفة بين المكالمات إلى "pushMatrix ()" و "popMatrix ()" هي الأكثر إرباكًا في المخطط. لحسن الحظ ، يمكننا تقسيمها إلى قسمين لفهمها: تحريك صورتنا وتوسيع نطاقها ورسم صورة ظلية محسوبة بواسطة OpenCV.

الأسطر الثلاثة الأولى من هذا القسم لا تفعل شيئًا غير تغيير مرجعنا. pushMatrix () و popMatrix () هو اصطلاح غريب الأطوار يجعل رمز الرسم المعقد أسهل كثيرًا. ما يتيح لنا القيام به هو تغيير حجم وشكل رسم المعالجة الخاص بنا مؤقتًا حتى نتمكن من استخدام نفس رمز الرسم مرارًا وتكرارًا للرسم بمقاييس مختلفة وعلى أجزاء مختلفة من الشاشة.

pushMatrix ()؛ ترجمة (س + 20 ، ص) ؛ نطاق (0.2)؛

وإليك كيف يعمل. أولاً ندعو pushMatrix () ، وهو ما يعني: "حفظ مكاننا" حتى نتمكن من العودة إليها عندما نسمي popMatrix (). ثم نسميها "translate ()" التي تنقلنا إلى جزء مختلف من الرسم باستخدام المتغيرات x و y التي حددناها أعلاه بناءً على الإطار الحالي. ثم نسميها "scale ()" حتى يتسنى لأي شيء آخر نرسمه حتى يصبح popMatrix () 20 في المائة بالحجم الطبيعي.

نتيجة هذه الأسطر الثلاثة هي أنه يمكننا القيام بجزء OpenCV الذي يأتي بعد ذلك - حساب ورسم الخط - دون الحاجة إلى التفكير في مكان حدوث ذلك على الشاشة. بدون pushMatrix ، يتعين علينا إضافة قيمتي x و y إلى كل إحداثياتنا وضرب جميع أحجامنا بمقدار 0.2. هذا يجعل الأمور أكثر بساطة.

الآن ، رمز OpenCV:

Blob [] blobs = opencv.blobs (1 ، العرض * الارتفاع / 2 ، 100 ، صحيح ، OpenCV.MAX_VERTICES * 4) ؛ من أجل (int i = 0 ؛ i

هذا الرمز يبدو معقدًا بالتأكيد ، لكنه ليس سيئًا للغاية. السطر الأكثر إثارة للاهتمام هو أول سطر ، والذي يطلق عليه "opencv.blobs ()". تعمل هذه الوظيفة على تحليل الصورة التي قمنا بتخزينها وتبحث عن المساحات المستمرة ، حيث تكون جميع وحدات البكسل المجاورة بنفس اللون. في حالة الفيلم المثال لدينا ، سيكون هناك نقطة واحدة بالضبط وسيكون حول صورة ظلية زاك. استخدامنا للعتبة قضى على كل شيء آخر من المشهد. إذا كنت تستخدم فيلمي الآخر أو فيلم العمق الخاص بك ، فقد يكون لديك العديد من النقاط وهذا جيد ، ستنتهي بملف متجه أكثر تعقيدًا.

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

وهذا كل ما في الأمر لإنشاء ملف DXF.

التحضير لليزر

بعد إنشاء ملف DXF هذا ، ستحتاج إلى إدخاله في Illustrator أو برنامج تحرير المتجهات المفضل لديك لإجراء بعض عمليات التنظيف الأساسية: قم بتجميع كل إطار معًا في كائن واحد ، وقطع أجزاء من الصور الظلية التي تتداخل مع المستطيل بحيث سيتم إرفاق الشكل فعليًا بقاعدته ، وما إلى ذلك. لقد اخترت أيضًا 9 من هذه الإطارات الاثني عشر ثم قمت بتكرارها حتى يكون لدي رسم متحرك بدلاً من إعادة تعيين مرة أخرى إلى وضعية البداية. لقد حمّلت ملف Illustrator النهائي هنا لتتمكن من الاطلاع عليه: contour_animation_for_laser.ai

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

إن الحصول على الحجم المناسب للفتحات بحيث يتم الضغط على الصور الظلية بشكل محكم دون أي غراء استغرق القليل من التجارب وبعض البدايات الخاطئة على الليزر. يمكنك تنزيل ملف Illustrator لهذا التصميم من هنا: contour_disc_for_laser.ai

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

نأمل أن يكون هذا البرنامج التعليمي قد أعطاك ما يكفي لما تحتاج إليه لبدء تسجيل بيانات عمق Kinect واستخدامه لإنشاء ملفات متجهة قابلة لليزر. إستمتع!

الحصول على Zoetropes الليزر قطع الخاص بك!

استجابة لجميع ردود الفعل الكبيرة لهذا المشروع ، لقد بدأت تشغيل موقع لإنتاج zoetropes مقطوعة بالليزر للشراء: PhysicalGIF.com. نحن نقدم مجموعات لتجميع zoetropes من صور GIF المتحركة المصممة. سوف تأتي الطُرز مع كل ما تحتاجه لتجميع zoetrope مثل تلك الموضحة هنا: الأجزاء المقطعة بالليزر ، القاعدة ، وحتى ضوء القوية. في النهاية ، ستتمكن حتى من تحميل ملفات GIF الخاصة بك لتحويلها إلى شكل مادي. توجه إلى هناك الآن للتسجيل ليتم إعلامك عند توفر هذه المجموعات.

المزيد: راجع جميع أعمدة Codebox هنا تفضل بزيارة صفحة Make: Arduino لمعرفة المزيد عن متحكم هواية الشائع هذا

في صانع السقيفة:

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



قد تكون مهتمة

ما هي الثورة الصناعية الجديدة؟

ما هي الثورة الصناعية الجديدة؟


الكيفية: أضواء الصور LED

الكيفية: أضواء الصور LED


القادمة إلى نيويورك: الطريق إلى صانع التحدي

القادمة إلى نيويورك: الطريق إلى صانع التحدي


دعوة لصانعي: العالم صانع فير نيويورك

دعوة لصانعي: العالم صانع فير نيويورك