جدول المحتويات:
- الخطوة الأولى: الأشياء المطلوبة:
- الخطوة الثانية: مبدأ العمل:
- الخطوة 3: التقاط المدخلات والمعالجة:
- الخطوة الرابعة:
- الخطوة الخامسة:
- الخطوة 6: جزء المعالجة:
- الخطوة السابعة:
- الخطوة الثامنة:
- الخطوة 9:
- الخطوة 10:
- الخطوة 11:
- الخطوة 12: التحكم في الحركة:
- الخطوة 13:
فيديو: صقر الإيماءة: روبوت يتم التحكم فيه بإيماءات يدوية باستخدام واجهة تعتمد على معالجة الصور: 13 خطوة (بالصور)
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:39
تم عرض Gesture Hawk في TechEvince 4.0 كواجهة بسيطة تعتمد على معالجة الصور بين الإنسان والآلة. تكمن فائدتها في حقيقة أنه لا يلزم وجود أجهزة استشعار إضافية أو يمكن ارتداؤها باستثناء القفاز للتحكم في السيارة الآلية التي تعمل على مبدأ القيادة التفاضلية. في هذا الدليل ، سنأخذك عبر مبدأ العمل وراء تتبع الكائنات واكتشاف الإيماءات المستخدمة في النظام. يمكن تنزيل الكود المصدري لهذا المشروع من Github عبر الرابط:
الخطوة الأولى: الأشياء المطلوبة:
- سائق محرك L298N
- دي سي موتورز
- شاسيه سيارة روبوت
- اردوينو اونو
- بطاريات ليبو
- كابل USB اردوينو (طويل)
- مكتبة OpenCV مع بايثون
الخطوة الثانية: مبدأ العمل:
Gesture Hawk هو نظام معالجة ثلاثي المراحل كما ترون في الرسم البياني أعلاه.
الخطوة 3: التقاط المدخلات والمعالجة:
يمكن فهم التقاط المدخلات في الفئات الأوسع الواردة في الرسم البياني أعلاه.
لاستخراج شكل اليد من البيئة ، نحتاج إلى استخدام إخفاء أو ترشيح لون محدد (في هذه الحالة - أزرق بنفسجي). للقيام بذلك ، تحتاج إلى تحويل الصورة من تنسيق BGR إلى تنسيق HSV الذي يمكن القيام به باستخدام مقتطف الشفرة التالي.
hsv = cv2.cvtColor (frame، cv2. COLOR_BGR2HSV)
الآن ، الخطوة التالية هي العثور على النطاق المطلوب من معلمات HSV لاستخراج اليد عبر القناع أو المرشح. لهذا ، فإن أفضل طريقة هي استخدام أشرطة المسار للعثور على النطاق المناسب. فيما يلي لقطة شاشة لشريط المسار المستخدم في هذا المشروع.
الخطوة الرابعة:
الخطوة الخامسة:
هنا ، يوجد مقتطف الشفرة أدناه لإنشاء شريط التتبع هذا لبناء القناع:
استيراد السيرة الذاتية 2
استيراد numpy كـ npdef لا شيء (x): تمرير cv2.itledWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H'، 'image'، 110، 255، nothing) cv2.createTrackbar ('l_S '،' image '، 50، 255، لا شيء) cv2.createTrackbar (' l_V '،' image '، 50، 255، لا شيء) cv2.createTrackbar (' h_H '،' image '، 130، 255، لا شيء) cv2. createTrackbar ('h_S'، 'image'، 255، 255، لا شيء) cv2.createTrackbar ('h_V'، 'image'، 255، 255، لا شيء) بينما (1): _، frame = img.read ()
hsv = cv2.cvtColor (frame، cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos ('l_H'، 'image') lS = cv2.getTrackbarPos ('l_S'، 'image') lV = cv2.getTrackbarPos ('l_V'، 'image') hH = cv2.getTrackbarPos ('h_H'، 'image') hS = cv2.getTrackbarPos ('h_S'، 'image') hV = cv2.getTrackbarPos ('h_V'، 'image') lower_R = np. صفيف ([lH، lS، lV]) above_R = np.array ([hH، hS، hV]) القناع = cv2.inRange (hsv، less_R، above_R) res = cv2.bitwise_and (frame، frame، mask = mask) cv2.imshow ('image'، res) k = cv2.waitKey (1) & 0xFF if k == 27: break cv2.destroyAllWindows ()
الخطوة 6: جزء المعالجة:
حسنًا ، لقد حصلنا على الشكل الهندسي لليد ، والآن حان الوقت لاستغلالها واستخدامها لمعرفة إيماءة اليد.
هيكل محدب:
من خلال الهيكل المحدب ، نحاول أن نلائم مضلعًا تقريبيًا عبر النقاط القصوى الموجودة في الشكل. تُظهر الصورة الموجودة على اليسار المضلع التقريبي الذي تم تعيينه للشكل مع تمييز النقاط المحدبة باللون الأحمر.
النقاط المحدبة هي تلك النقاط الموجودة في الشكل الأبعد عن أحد جوانب هذا المضلع التقريبي. لكن مشكلة الهيكل المحدب هي أنه أثناء حسابه ، سنحصل على مصفوفة من جميع النقاط المحدبة ولكن ما نحتاجه هو النقطة المحدبة ذات اللون الأزرق. سنخبرك لماذا هو مطلوب.
لإيجاد هذه النقطة المحدبة ، علينا تطبيق صيغة المسافة العمودية لإيجاد مسافة النقطة المحدبة بأقرب ضلع. لاحظنا أن النقطة المدببة الزرقاء تمتلك أقصى مسافة من الجانب ، وبالتالي نحصل على هذه النقطة.
الخطوة السابعة:
الخطوة الثامنة:
بعد ذلك ، نحتاج إلى إيجاد ميل الخط الذي يربط طرف الإبهام (أو النقطة القصوى) بهذه النقطة المحدبة الأفقية.
الخطوة 9:
في الحالة أعلاه ، يجب أن تكون الزاوية α بين 0 إلى 90 درجة إذا كانت الإيماءة للانعطاف لليسار. وهذا يعني أن tan (α) يجب أن يكون موجبًا.
الخطوة 10:
في الحالة المذكورة أعلاه ، يجب أن تكون الزاوية α بين 180 إلى 90 درجة إذا كانت الإيماءة للانعطاف الأيمن. وهذا يعني أن tan (α) يجب أن يكون سالبًا.
لذلك ، إذا كانت Tan α موجبة ، ثم انعطف لليسار. إذا كانت Tan α سالبة ، ثم انعطف إلى اليمين. حان الوقت الآن لمعرفة كيفية اكتشاف أهم أمر إيقاف.
هنا ، يتم فحص نسبة محددة (تم العثور عليها من خلال الضربة والتجربة) وفي الحالات القصوى تظل هذه النسبة من المسافات في هذا النطاق المعين.
الخطوة 11:
أخيرًا ، يتم تحليل إيماءة الحركة الأمامية بواسطة وظيفة matchShape () في OpenCV. تقارن هذه الوظيفة شكل عدّادَين ، في هذه الحالة ، بين مثال التدريب على اليمين في الصورة أعلاه والمحيط في الجانب الأيسر من الصورة أعلاه. تقوم بإرجاع قيمة تتراوح من 0 إلى 2 أو 3 ، وفقًا للاختلاف الموجود في شكل محيطين. بالنسبة إلى الكفاف نفسه ، يتم إرجاع 0.
ret = cv2.matchShapes (cnt1، cnt2، 1، 0.0)
هنا ، cn1 و cnt2 هما الكفافان اللذان يجب مقارنتهما.
الخطوة 12: التحكم في الحركة:
PySerial:
استخدمنا مكتبة PySerial للبيثون لتحويل البيانات المعالجة إلى بيانات تسلسلية لتوصيلها إلى Arduino Uno عبر كابل Arduino USB. بمجرد اكتشاف إيماءة معينة بواسطة opencv ، أنشأنا متغيرًا مؤقتًا يقول "x" وخصصنا له بعض القيمة الفريدة وقمنا بتحويله إلى إدخال تسلسلي باستخدام سطر الأوامر التالي: -
استيراد المسلسل # لاستيراد مكتبة Pyserial
serial. Serial ('' ، معدل الباود = '9600' ، المهلة = '0') # إعداد الإخراج التسلسلي.. اسم المنفذ هو اسم المنفذ الذي سيتم من خلاله نقل البيانات.
serial.write (b'x ') # x هي الأبجدية المرسلة إلى المنفذ … b لتحويل هذه السلسلة إلى بايت.
معالجة اردوينو:
الآن يتم ترميز arduino بطريقة يتم فيها تعيين كل سلسلة x مختلفة خطيًا لإجراء معين مسؤول عن الحركة السلسة للروبوت (على سبيل المثال ، سيؤدي اكتشاف الإيماءة اليسرى إلى تشغيل المحركات على اليمين إلى اليسار). يمكننا التحكم في حركة كل عجلة انتقاليًا وكذلك دورانيًا عن طريق تغيير الكود بشكل صحيح.
L298N سائق المحرك: -
يتم استخدام محرك المحرك كوسيط بين المحرك ومصدر الطاقة حيث لا يمكن تشغيل المحركات بشكل مباشر بسبب معدلات الجهد المنخفض. يتم توصيل بطارية Li-Po بطرف الإدخال بجهد 12 فولت ونقوم بتوصيل مقبس اردوينو 5 فولت بمقبس إدخال 5 فولت لسائق المحرك الذي يربط أخيرًا أرضي Li-Po بالإضافة إلى arduino في مقبس أرضي مشترك لسائق المحرك.
الآن يتم توصيل أطراف المحركات في مآخذ معينة. أخيرًا ، نقوم بتوصيل أطراف الإدخال للمحرك بمآخذ إخراج PWM في اردوينو مما يتيح لنا حرية تحديد جوانب الدوران والترجمة للحركة بدقة.
موصى به:
روبوت بإيماءات يتم التحكم فيه باستخدام Arduino: 7 خطوات
روبوت يتم التحكم فيه بالإيماءات باستخدام Arduino: تُستخدم الروبوتات في العديد من القطاعات مثل البناء والجيش والتصنيع والتجميع وما إلى ذلك. يمكن أن تكون الروبوتات مستقلة أو شبه مستقلة. لا تتطلب الروبوتات المستقلة أي تدخل بشري ويمكنها التصرف بمفردها وفقًا للحالة. حد
روبوت يتم التحكم فيه عبر Wi-Fi باستخدام تطبيق Wemos D1 ESP8266 و Arduino IDE و Blynk: 11 خطوة (بالصور)
روبوت يتم التحكم فيه عبر Wi-Fi باستخدام تطبيق Wemos D1 ESP8266 و Arduino IDE و Blynk: في هذا البرنامج التعليمي ، سأوضح لك كيفية إنشاء خزان آلي يتم التحكم فيه عن طريق Wi-Fi ويتم التحكم فيه من هاتف ذكي باستخدام تطبيق Blynk. في هذا المشروع ، تم استخدام لوحة ESP8266 Wemos D1 ، ولكن يمكن أيضًا استخدام نماذج الألواح الأخرى (NodeMCU ، Firebeetle ، إلخ) ، و
قطار نموذج يتم التحكم فيه بواسطة لوحة المفاتيح V2.0 - واجهة PS / 2: 13 خطوة (بالصور)
قطار نموذج يتم التحكم فيه بواسطة لوحة المفاتيح V2.0 | واجهة PS / 2: في واحدة من Instructable السابقة ، أوضحت لك كيفية التحكم في تخطيط نموذج للسكك الحديدية باستخدام لوحة مفاتيح. لقد كان أداءً رائعًا ولكن كان له عيب يتطلب تشغيل جهاز كمبيوتر. في Instructable ، دعنا نرى كيفية التحكم في نموذج القطار باستخدام keyboar
روبوت يتم التحكم فيه صوتيًا باستخدام متحكم 8051: 4 خطوات (بالصور)
روبوت يتم التحكم فيه صوتيًا باستخدام متحكم 8051: يأخذ الروبوت الذي يتم التحكم فيه بالصوت أمرًا محددًا في شكل صوت. مهما كان الأمر الذي يُعطى من خلال وحدة الصوت أو وحدة Bluetooth ، يتم فك تشفيره بواسطة وحدة التحكم الحالية ومن ثم يتم تنفيذ الأمر المحدد. هنا في هذا المشروع ، أنا
روبوت يتم التحكم فيه عن بعد باستخدام Arduino و TV Remote: 11 خطوة
روبوت يتم التحكم فيه عن بعد باستخدام Arduino و TV Remote: يمكن تحريك هذه السيارة التي يتم التحكم فيها عن بعد باستخدام أي نوع من أجهزة التحكم عن بعد مثل التلفزيون والتيار المتردد وما إلى ذلك ، وهي تستفيد من حقيقة أن جهاز التحكم عن بعد يصدر الأشعة تحت الحمراء (الأشعة تحت الحمراء). باستخدام مستقبل الأشعة تحت الحمراء ، وهو جهاز استشعار رخيص جدًا