آموزش رزبری پایپروژه رزبری پای

کنترل ویدئو پلیر (پخش کننده فیلم) با حرکت دست مبتنی بر رزبری پای

به دلیل رشد و محبوبیت اخیر فناوری های واقعیت مجازی و واقعیت افزوده ، فناوری تشخیص حرکت دست بسیار زیاد محبوب شده است. در آموزش قبلی ما یک مدل تشخیص حرکات دست را طراحی کردیم تا بازی سنگ کاغذ قیچی را با رزبری پای با استفاده از Tensorflow و Keras طراحی کنیم. در این آموزش ، ما قصد داریم از کتابخانه MediaPipe Python برای تشخیص حرکات دست خود و کنترل پخش کننده فیلم رزبری پای با استفاده از آن استفاده کنیم. در اینجا ما از شش حرکت دست ، یعنی باز کردن و بستن مشت و حرکت بالا ، پایین ، چپ و راست دست استفاده خواهیم کرد. از حرکات باز و بسته مشت برای پخش و توقف ویدیو استفاده می شود. از حرکات بالا و پایین برای افزایش و کاهش صدا استفاده می شود و از حرکات چپ و راست برای جلو و عقب کردن فیلم استفاده می شود.

در این پروژه ما فقط به ماژول دوربین و Raspberry Pi 4 نیاز داریم که OpenCV و MediaPipe روی آن نصب شده است. OpenCV در اینجا برای پردازش تصویر دیجیتالی استفاده می شود در حالی که MediaPipe برای تشخیص حرکات دستی استفاده می شود.

MediaPipe چیست؟

MediaPipe چارچوبی برای ایجاد چند پلتفرم چند منظوره (به عنوان مثال Android ، iOS ، وب و…) (به عنوان مثال ویدئو ، صدا و…) است که از استنتاج سریع ML ، بینایی رایانه ای کلاسیک و پردازش رسانه تشکیل شده است. بسته MediaPipe Python در PyPI برای لینوکس ، macOS و Windows موجود است. برای نصب MediaPipe بر روی رزبری پای 4 از دستور زیر استفاده کنید:

sudo pip3 install mediapipe-rpi4

اگر Pi 4 ندارید ، می توانید با استفاده از دستور زیر آن را روی Raspberry Pi 3 نصب کنید:

برای یادگیری آردوینو (برنامه نویسی، ساخت ربات، ارتباط با اندروید) روی دوره آموزش آردوینو کلیک کنید.
برای یادگیری کامل الکترونیک روی دوره آموزش الکترونیک کلیک کنید.
sudo pip3 install mediapipe-rpi3

نصب OpenCV روی رزبری پای

قبل از نصب OpenCV و سایر وابستگی ها ، رزبری پای باید کاملاً به روز شود. برای به روز رسانی رزبری پای به آخرین نسخه از دستورات زیر استفاده کنید:

sudo apt-get update

سپس از دستورات زیر برای نصب وابستگی های مورد نیاز برای نصب OpenCV بر روی رزبری پای خود استفاده کنید.

sudo apt-get install libhdf5-dev -y 
sudo apt-get install libhdf5-serial-dev –y 
sudo apt-get install libatlas-base-dev –y 
sudo apt-get install libjasper-dev -y 
sudo apt-get install libqtgui4 –y
 sudo apt-get install libqt4-test –y

پس از آن ، از دستور زیر برای نصب OpenCV روی رزبری پای خود استفاده کنید.

pip3 install opencv-contrib-python==4.1.0.25

نصب PyAutoGUI در رزبری پای

PyAutoGUI یک ماژول پایتون GUI است که به اسکریپت های پایتون شما اجازه می دهد موس و صفحه کلید را کنترل کرده و تعاملات خود را با سایر برنامه ها به صورت خودکار انجام دهند. PyAutoGUI روی ویندوز ، macOS و لینوکس کار می کند و بر روی پایتون 2 و 3 اجرا می شود. برای نصب PyAutoGUI در رزبری پای ، دستور زیر را اجرا کنید:

pip3 install pyautogui

برنامه نویسی رزبری پای برای کنترل فیلم با حرکت دست

کد کامل این پروژه در انتهای صفحه در فایل دانلودی قرار داده شده است. در اینجا قسمت های مهم کد را بررسی میکنیم.

کد را با وارد کردن بسته های OpenCV ، MediaPipe و PyAutoGUI شروع کنید. همانطور که قبلاً ذکر شد MediaPipe بسته اصلی برای تشخیص دست است و که OpenCV برای پردازش تصویر استفاده می شود. PyAutoGUI برای کنترل صفحه کلید با توجه به حرکات استفاده می شود.

import cv2
import mediapipe as mp
import pyautogui

در سطرهای بعدی ، دو متغیر جدید ایجاد کرده ایم. مورد اول mp_drawing است که برای دریافت ابزارهای رسم از بسته MediaPipe python و دومی mp_hands است که برای وارد کردن مدل تشخیص حرکت دست استفاده می شود.

mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands

پس از آن یک تابع به نام ()findPosition تعریف کنید. همانطور که از نامش پیداست برای پیدا کردن مختصات X ، Y از انگشت اشاره ، میانی و… استفاده می شود. مختصات تمام نوک انگشتان در متغیری به نام lmList [] ذخیره می شود.

def fingerPosition(image, handNo=0):
    lmList = []
    if results.multi_hand_landmarks:
        myHand = results.multi_hand_landmarks[handNo]
        for id, lm in enumerate(myHand.landmark):
            # print(id,lm)
            h, w, c = image.shape
            cx, cy = int(lm.x * w), int(lm.y * h)
            lmList.append([id, cx, cy])
    return lmList

سپس ویدئو را از دوربین رزبری پای با ارتفاع و عرض 720 ، 640 دریافت کنید.

cap = cv2.VideoCapture(0)
cap.set(3, wCam)
cap.set(4, hCam)

سپس در خط بعدی یک نمونه جدید برای feedpipe feed تنظیم کنید تا به مدل Hand Tracking که قبلاً وارد کردیم دسترسی پیدا کنید. ما همچنین دو آرگومان یعنی حداقل اطمینان تشخیص و حداقل اطمینان ردیابی را ایجاد کرده ایم. در مرحله بعد ، فریم های ویدئویی را می خوانیم و آنها را در متغیر تصویر ذخیره می کنیم.

mp_hands.Hands(min_detection_confidence=0.8, min_tracking_confidence=0.5)

همچنین اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید
  while cap.isOpened():
  success, image = cap.read()

تصویری که از فید ویدئویی دریافت کردیم در اصل با فرمت BGR است. بنابراین ، در این خط ، ابتدا تصویر را به صورت افقی و سپس تصویر BGR را به RGB تبدیل می کنیم.

image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
image.flags.writeable = False

پس از آن ، ما قصد داریم تصویر را از طریق مدل Hand Tracking عبور دهیم تا تشخیص ها را انجام دهیم و نتایج را در متغیری به نام “results” ذخیره کنیم.

results = hands.process(image)

پس از تکمیل تشخیص ، پرچم image.flags.writeable را روی true قرار می دهیم و تصویر RGB را به BGR تبدیل می کنیم.

image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

اکنون ، با دریافت نتایج تشخیص ، متغیر mp_drawing را فرا می گیریم تا این تشخیص ها را روی تصویر ترسیم کنیم.

   if results.multi_hand_landmarks:
      for hand_landmarks in results.multi_hand_landmarks:
        mp_drawing.draw_landmarks(
            image, hand_landmarks, mp_hands.HAND_CONNECTIONS)

پس از آن ، تابع findPosition () را فرا می گیریم تا شناسه ها و مختصات همه تشخیص ها را بدست آوریم. این مقادیر در داخل متغیری به نام lmList ذخیره می شوند.

lmList = findPosition(image, draw=True)

اکنون که مختصاتی برای همه نشانه های دست داریم ، از آنها برای تشخیص حرکات مختلف دست استفاده می کنیم و اولین آنها تشخیص باز یا بسته بودن مشت است. برای این منظور ، مختصات نوک انگشتان [8 ، 12 ، 16 ، 20] و نقاط میانی [6 ، 10 ، 14 ، 19] را مقایسه می کنیم و اگر نوک انگشتان زیر نقاط میانی باشد ، مشت بسته و در غیر اینصورت باز است.

 

        for id in range(1, 5):
            if lmList[tipIds[id]][2] < lmList[tipIds[id] - 2][2]:
                fingers.append(1)
            if (lmList[tipIds[id]][2] > lmList[tipIds[id] - 2][2]):
                fingers.append(0)

سپس در خطوط بعدی تعداد انگشتان را شمرده و آن را در متغیری به نام totalFingers ذخیره کنید.

totalFingers = fingers.count(1)
        print(totalFingers)

اکنون که تعداد انگشتان دست را گرفته ایم ، از آنها برای پخش و توقف ویدیو استفاده خواهیم کرد.

        if totalFingers == 4:
            state = "Play"
        if totalFingers == 0 and state == "Play":
            state = "Pause"
            pyautogui.press('space')
            print("Space")

سپس حرکت بعدی که می خواهیم تشخیص دهیم حرکت چپ ، راست ، بالا و پایین است. برای تشخیص حرکت چپ و راست ، ابتدا ، مختصات X نوک انگشت اشاره را دریافت می کنیم و اگر مقدار کمتر از 300 باشد ، حرکت چپ و اگر مقدار بیشتر از 400 است ، حرکت راست است.

        if totalFingers == 1:
            if lmList[8][1]<300:
                print("left")
                pyautogui.press('left')
            if lmList[8][1]>400:
                print("Right")
                pyautogui.press('Right')

به طور مشابه ، برای تشخیص حرکات بالا و پایین ، مختصات Y انگشت وسط را دریافت می کنیم و اگر مقدار کمتر از 210 باشد ، حرکت به بالا است و اگر مقدار بیشتر از 230 باشد ، حرکت به پایین است.

        if totalFingers == 2:
            if lmList[9][2] < 210:
                print("Up")
                pyautogui.press('Up')
            if lmList[9][2] > 230:
                print("Down")
                pyautogui.press('Down')

اکنون ، بررسی کنید که دوربین Pi کار می کند یا خیر. پس از بررسی دوربین ، اسکریپت پایتون را راه اندازی کنید و پنجره ای را مشاهده خواهید کرد که حاوی ویدئو در آن است. اکنون می توانید پخش کننده ویدیو را با حرکات دست خود کنترل کنید.

موارد موجود در فایل : سورس کامل

دانلود فایل های پروژه

برای مشاهده توضیحات روی دوره مورد نظر کلیک کنید.

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام آیرنکس را دنبال کنید.

تصویر از محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید) سعی میکنم تمام نظرات را پاسخ دهم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *