تتبع اليد هو عملية استخدام رؤية الكمبيوتر لاكتشاف ومتابعة حركات يد الشخص في الوقت الفعلي. التطبيق الأكثر شيوعًا لتتبع اليد هو في سماعات الواقع الافتراضي. تسمح لك سماعات الرأس باستخدام يديك كمدخلات بدلاً من أجهزة التحكم التي تعمل باللمس. وهذا بدوره يجعل التجربة غامرة أكثر.
تعرف على كيفية تتبع أيدي أي شخص باستخدام Python و OpenCV لرؤية الكمبيوتر و MediaPipe.
طورت Google إطار عمل MediaPipe ، والذي يحتوي على العديد من حلول التعلم الآلي. أحد الحلول هو حل تتبع اليد والأصابع يسمى أيدي MediaPipe. لتتبع اليدين ، تقوم MediaPipe Hands بإجراء عمليتين: اكتشاف راحة اليد واكتشاف المعالم.
كشف اليد
يبدأ MediaPipe بتحديد مكان النخيل في صورة الإدخال. نظرًا لأن تقدير الصناديق المحيطة للأشياء الصلبة أسهل من تحديد اليدين بأصابع مفصلية.
كشف معالم اليد
بعد اكتشاف راحة اليد ، يقوم MediaPipe باكتشاف معالم اليد. يمكن أن يتنبأ نموذج المعلم اليدوي بـ 21 إحداثيات دقيقة لموقع كل معلم يدوي.
تمثل الأرقام معرفًا فريدًا لكل معلم.
إعداد بيئتك
لمتابعة هذا المشروع ، يجب أن تكون على دراية بـ أساسيات لغة بايثون. قم بتثبيت المكتبات التالية في بيئتك:
- OpenCV: ستستخدم هذه المكتبة لرؤية الكمبيوتر ولتنفيذ تقنيات معالجة الصور على صورة الإدخال.
- MediaPipe: ستستخدم هذه المكتبة لأداء الكشف عن اليد والتتبع على صورة الإدخال.
- imutils: ستقوم هذه المكتبة بتغيير حجم إطار الفيديو للإدخال.
قم بتشغيل الأمر التالي على الجهاز الخاص بك لتثبيت مكتبات OpenCV و MediaPipe و imutils. تثبيت pip — مدير حزمة Python-إذا كنت بحاجة إلى. تأكد من تمرير المكتبات كقائمة محددة بمسافات.
نقطة تثبيت برنامج OpenCV-Python MediaPipe imutils
عند اكتمال التحديث ، تكون البيئة جاهزة لبدء الترميز.
كود المصدر الكامل لهذا المشروع متاح في ملفه مستودع جيثب.
استيراد المكتبات المطلوبة
ستحتاج إلى استيراد المكتبات التي ثبتها حتى تتمكن من استخدامها. افتح أي ملف Python IDE، وأنشئ ملف Python وأضف عمليات الاستيراد التالية:
يستورد السيرة الذاتية 2
يستورد ميديابيب مثل النائب
يستورد إيموتيلس
تأكد من استيراد OpenCV كـ cv2 و MediaPipe بأحرف صغيرة. سيؤدي عدم القيام بذلك إلى حدوث خطأ.
ستستخدم mpHands للاتصال بحل أيدي MediaPipe ، وكائن اليدين لاكتشاف مدخلات اليد وتتبعها. ستستخدم كائن mpDraw لرسم الروابط بين معالم العقارب المحددة.
mpHands = mp.solutions.hands
الأيدي = mp اليدين ()
mpDraw = mp.solutions.drawing_utils
يمكنك ضبط نموذج عقارب MediaPipe عن طريق تمرير معلمات متنوعة إلى مُنشئ Hands (). القيم الافتراضية جيدة بما يكفي لهذا المشروع ، ولكن يمكنك تجربتها لمعرفة كيفية تأثيرها على النموذج:
يجب عليك ترك static_image_mode. الصورة_الثابتة كخطأ للتأكد من أن النموذج يكتشف العقارب مرة واحدة قبل أن يبدأ في تتبعها. إنه يكرر عملية التتبع فقط إذا انخفضت ثقة الاكتشاف أقل من المعلمة المُعلنة ، مما يجعل معالجة الإدخال الإجمالية أسرع.
أداء تتبع اليد
أنت بحاجة إلى ثلاث وظائف لأداء تتبع اليد: واحدة لمعالجة الإدخال ، وواحدة لرسم اتصالات المعالم اليدوية ، ووظيفة رئيسية للتحكم في تدفق البرنامج.
وظيفة معالجة المدخلات
تأخذ هذه الوظيفة المدخلات وتحولها إلى التدرج الرمادي وتمررها إلى نموذج عقارب MediaPipe لاكتشاف وتتبع العقارب في الإدخال.
# معالجة الصورة المدخلة
defعملية_صورة(IMG):
# تحويل المدخلات إلى التدرج الرمادي
gray_image = cv2.cvtColor (img، cv2.COLOR_BGR2RGB)
النتائج = hand.process (gray_image)
# إعادة الأيدي المكتشفة إلى وظيفة الاستدعاء
يعود نتائج
تقوم الوظيفة بإرجاع النتائج حول ما إذا كان هناك أي عقارب تم اكتشافها على الإدخال.
وظيفة رسم وصلات Hand Landmark
تتحقق هذه الوظيفة مما إذا كانت وظيفة معالجة الإدخال قد اكتشفت أي يد. إذا تم اكتشاف أي أيدي ، فإنها تدور فوق كل معلم وترسم دائرة حولها ، وتتبع المعلم باستخدام دالة التعداد في بايثون. ثم يقوم برسم الاتصالات بين المعالم على إدخال الفيديو الأصلي.
# رسم اتصالات المعالم
defالربط اليدوي(img ، النتائج):
لو النتائج.
ل handLms في النتائج.
ل معرف ، م في عدّد (handLms.landmark):
ح ، ث ، ج = img.shape# البحث عن إحداثيات كل معلم
cx ، cy = int (lm.x * w) ، int (lm.y * h)# طباعة كل هوية وإحداثيات مميزة
# على المحطة
طباعة (معرف ، cx ، cy)# إنشاء دائرة حول كل معلم
cv2.circle (img، (cx، cy) ، 10, (0, 255, 0),
السيرة الذاتية 2 ممتلئة)
# رسم وصلات المعالم
mpDraw.draw_landmarks (img ، handLms ،
الأيدي. HAND_CONNECTIONS)
يعود IMG
تبدأ الوظيفة بتدوير كل معلم:
ثم يقوم برسم وصلات اليد:
تقوم أخيرًا بإرجاع ناتجها إلى وظيفة الاستدعاء.
الوظيفة الرئيسية
قم بإنشاء وظيفة رئيسية تتحكم في تدفق برنامجك. سوف يستغرق الإدخال وتغيير حجم إطار الفيديو لضمان اتساق المخرجات. قم بتمرير الإدخال إلى وظيفة المعالجة التي ستكتشف بعد ذلك الأيدي وتتبعها. خذ النتائج التي تم إرجاعها إلى وظيفة رسم اتصال معالم اليد التي سترسم الاتصال على إدخال الفيديو الأصلي. سيعرض الإخراج أخيرًا للمستخدم.
defرئيسي():
# استبدل 0 بمسار الفيديو لاستخدام ملف
# مقطع فيديو مسجل مسبقًا
cap = cv2.VideoCapture (0)بينماحقيقي:
# أخذ المدخلات
نجاح الصورة = cap.read ()
الصورة = imutils.resize (الصورة ، العرض =500الارتفاع =500)
النتائج = process_image (صورة)
draw_hand_connections (صورة ، نتائج)# عرض الإخراج
cv2.imshow ("تعقب اليد"، صورة)
# ينتهي البرنامج عند الضغط على مفتاح q
لو cv2.waitKey (1) == أمر ("ف"):
cap.release ()
cv2.destroyAllWindows ()
الخطوة الأخيرة هي تشغيل البرنامج الخاص بك. يضمن الكود أدناه أنه عند تشغيل البرنامج ، تعمل الوظيفة الرئيسية أولاً.
لو __name__ == "__رئيسي__":
رئيسي()
عند تشغيل البرنامج ، ينتج مثل هذا الإخراج:
يتتبع البرنامج العقارب في الوقت الحقيقي.
تتبع اليد للواقع الافتراضي الغامر
التتبع اليدوي في الواقع الافتراضي يجعل التكنولوجيا أكثر جاذبية. بدأت سماعات الواقع الافتراضي في إدخال التتبع اليدوي ، مما يضفي إحساسًا بالواقع المعزز إلى العالم الافتراضي. تسمح سماعات الرأس للمستخدم بإدخال الأوامر باستخدام يد افتراضية.
يعد التتبع اليدوي في سماعات الرأس الافتراضية مجرد تطبيق واحد لهذه التقنية. يمكنك دمج تتبع اليد في أي منطقة ترضيك.