جدول المحتويات:

صقر الإيماءة: روبوت يتم التحكم فيه بإيماءات يدوية باستخدام واجهة تعتمد على معالجة الصور: 13 خطوة (بالصور)
صقر الإيماءة: روبوت يتم التحكم فيه بإيماءات يدوية باستخدام واجهة تعتمد على معالجة الصور: 13 خطوة (بالصور)

فيديو: صقر الإيماءة: روبوت يتم التحكم فيه بإيماءات يدوية باستخدام واجهة تعتمد على معالجة الصور: 13 خطوة (بالصور)

فيديو: صقر الإيماءة: روبوت يتم التحكم فيه بإيماءات يدوية باستخدام واجهة تعتمد على معالجة الصور: 13 خطوة (بالصور)
فيديو: اشتريت روبوت يتحرك مثل الانسان !! 🤖 ( حلقة المستقبل !! 😍 ) 2024, شهر نوفمبر
Anonim
صقر الإيماءة: روبوت يتم التحكم فيه بإيماءات يدوية باستخدام واجهة تعتمد على معالجة الصور
صقر الإيماءة: روبوت يتم التحكم فيه بإيماءات يدوية باستخدام واجهة تعتمد على معالجة الصور

تم عرض Gesture Hawk في TechEvince 4.0 كواجهة بسيطة تعتمد على معالجة الصور بين الإنسان والآلة. تكمن فائدتها في حقيقة أنه لا يلزم وجود أجهزة استشعار إضافية أو يمكن ارتداؤها باستثناء القفاز للتحكم في السيارة الآلية التي تعمل على مبدأ القيادة التفاضلية. في هذا الدليل ، سنأخذك عبر مبدأ العمل وراء تتبع الكائنات واكتشاف الإيماءات المستخدمة في النظام. يمكن تنزيل الكود المصدري لهذا المشروع من Github عبر الرابط:

الخطوة الأولى: الأشياء المطلوبة:

الأشياء المطلوبة
الأشياء المطلوبة
الأشياء المطلوبة
الأشياء المطلوبة
الأشياء المطلوبة
الأشياء المطلوبة
الأشياء المطلوبة
الأشياء المطلوبة
  1. سائق محرك L298N
  2. دي سي موتورز
  3. شاسيه سيارة روبوت
  4. اردوينو اونو
  5. بطاريات ليبو
  6. كابل USB اردوينو (طويل)
  7. مكتبة 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 في اردوينو مما يتيح لنا حرية تحديد جوانب الدوران والترجمة للحركة بدقة.

موصى به: