تعلم كيفية التعرف على الأيدي وتعقبها باستخدام OpenCV و Python

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


تعرف على كيفية تتبع أيدي أي شخص باستخدام Python و OpenCV for Computer Vision و MediaPipe.


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

كشف راحة اليد

يبدأ MediaPipe بتحديد مكان النخيل في صورة الإدخال. نظرًا لأن تقدير الصناديق المحيطة للأشياء الصلبة أسهل من تحديد اليدين بأصابع مفصلية.

كشف اليد جديلة

بعد اكتشاف راحة اليد ، يقوم MediaPipe باكتشاف علامة اليد. يمكن أن يتنبأ نموذج المعلم اليدوي بـ 21 إحداثيات دقيقة لموقع كل معلم يدوي.

    يد مع معالم مسماة

تمثل الأرقام معرفًا فريدًا لكل معلم.

تكوين بيئتك

لمتابعة هذا المشروع ، يجب أن تكون على دراية بـ أساسيات بايثون. قم بتثبيت المكتبات التالية في بيئتك:

  • OpenCV: ستستخدم هذه المكتبة لرؤية الكمبيوتر ولتنفيذ تقنيات معالجة الصور على صورة الإدخال.
  • MediaPipe: ستستخدم هذه المكتبة لأداء الكشف عن اليد والتتبع على صورة الإدخال.
  • imutils: ستستخدم هذه المكتبة لتغيير حجم صورة الفيديو المدخلة.

قم بتشغيل الأمر التالي على الجهاز الخاص بك لتثبيت مكتبات OpenCV و MediaPipe و imutils. تثبيت pip ، مدير حزمة Python-اذا احتجت. تأكد من تمرير المكتبات كقائمة محددة بمسافات.

pip install OpenCV-Python MediaPipe imutils

عند اكتمال التحديث ، تكون البيئة جاهزة لبدء الترميز.

استيراد المكتبات المطلوبة

ستحتاج إلى استيراد المكتبات التي قمت بتثبيتها من أجل استخدامها. افتح أي Python IDEأنشئ ملف Python وأضف الواردات التالية:

 import cv2
import mediapipe as mp
import imutils

تأكد من استيراد OpenCV كـ cv2 و MediaPipe كأحرف صغيرة. سيؤدي عدم القيام بذلك إلى حدوث خطأ.

ستستخدم mpHands للاتصال بحل أيدي MediaPipe وكائن اليدين لاكتشاف مدخلات اليد وتتبعها. ستستخدم كائن mpDraw لرسم الاتصالات بين علامات العقارب المحددة.

 mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils

يمكنك تحسين نموذج عقارب MediaPipe عن طريق تمرير العديد من المعلمات إلى مُنشئ Hands (). الإعدادات الافتراضية كافية لهذا المشروع ، ولكن يمكنك تجربتها لمعرفة كيفية تأثيرها على النموذج:

Pycharm IDE يعرض الإعدادات الافتراضية لـ MediaPipe Hands

يجب عليك ترك static_image_mode. الصورة_الثابتة to False للتأكد من أن النموذج يكتشف الإبر مرة واحدة قبل أن يبدأ في تتبعها. إنه يكرر عملية التتبع فقط إذا كانت ثقة الاكتشاف أقل من الإعداد المُعلن ، مما يؤدي إلى تسريع المعالجة الإجمالية للإدخالات.

تتبع الأيدي

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

وظيفة معالجة المدخلات

تأخذ هذه الوظيفة المدخلات وتحولها إلى التدرج الرمادي وتمررها إلى نموذج عقارب MediaPipe لاكتشاف وتتبع العقارب في الإدخال.

 
def process_image(img):
    
    gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    results = hands.process(gray_image)

    
    return results

تعرض الوظيفة نتائج تشير إلى ما إذا كانت هناك أيدي تم اكتشافها على الإدخال.

وظيفة رسم وصلات من معالم اليد

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

 
def draw_hand_connections(img, results):
    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            for id, lm in enumerate(handLms.landmark):
                h, w, c = img.shape

                
                cx, cy = int(lm.x * w), int(lm.y * h)

                
                
                print(id, cx, cy)

                
                cv2.circle(img, (cx, cy), 10, (0, 255, 0),
                           cv2.FILLED)
                
                mpDraw.draw_landmarks(img, handLms,
                                      mpHands.HAND_CONNECTIONS)

        return img

تبدأ الوظيفة بتدوير كل معلم:

إخراج برنامج مع كل نقطة جديلة محاطة بدائرة

ثم يقوم برسم الروابط اليدوية:

الإخراج من برنامج تتبع اليد

أخيرًا يرسل ناتجها مرة أخرى إلى وظيفة الاستدعاء.

الوظيفة الرئيسية

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

 def main():
   
   
    cap = cv2.VideoCapture(0)

    while True:
        
        success, image = cap.read()
        image = imutils.resize(image, width=500, height=500)
        results = process_image(image)
        draw_hand_connections(image, results)

        
        cv2.imshow("Hand tracker", image)

        
        if cv2.waitKey(1) == ord('q'):
            cap.release()
            cv2.destroyAllWindows()

الخطوة الأخيرة هي تشغيل البرنامج الخاص بك. يضمن الكود أدناه أنه عند تشغيل البرنامج ، تعمل الوظيفة الرئيسية أولاً.

 if __name__ == "__main__":
    main()

عند تشغيل البرنامج ، ينتج مثل هذا الإخراج:

الإخراج من برنامج تتبع اليد

البرنامج يتتبع الأيدي في الوقت الحقيقي.

التتبع اليدوي للواقع الافتراضي الغامر

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

يعد التتبع اليدوي في سماعات الرأس الافتراضية مجرد تطبيق واحد لهذه التقنية. يمكنك تضمين التتبع اليدوي في أي منطقة قابلة للتطبيق من اختيارك.

Leave a Comment