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

دستگاه شمارنده شنا سوئدی با رزبری پای (پردازش تصویر MediaPipe)

به دلیل رشد و محبوبیت اخیر واقعیت مجازی و افزوده ، فناوری های تشخیص حالت انسان رو به افزایش است. در آموزش قبلی خود ، ما از ماژول Media pipe Hand Track برای کنترل پخش کننده رسانه Raspberry Pi با استفاده از حرکات دست استفاده کردیم. در این پروژه ، ما قصد داریم از بسته MediaPipe Pose برای ایجاد یک شمارنده شنا سوئدی استفاده کنیم. ما از بسته Pose estimation برای بدست آوردن مختصات شانه و آرنج استفاده خواهیم کرد. مختصات شانه ها با مختصات آرنج مقایسه می شود. بنابراین ، اگر شانه ها در سطح آرنج یا زیر آرنج قرار داشته باشند ، به عنوان یک حرکت شنا محسوب می شود. ما همچنین یک اسپیکر را به رزبری پای متصل می کنیم تا تعداد شنا ها را اعلام کند.

قطعات مورد نیاز

  • رزبری پای 4
  • ماژول دوربین Pi
  • اسپیکر
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

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

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

برنامه نویسی رزبری پای برای شمارنده شما

کد کامل شمارنده شنا سوئی با استفاده از OpenCV در انتهای صفحه قرار داده شده است. در اینجا ، بخش های مهم کد را برای درک بهتر توضیح می دهیم.

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

import cv2
import mediapipe as mp

در سطرهای بعدی ، ما دو متغیر جدید ایجاد کرده ایم. اول mp_drawing است که برای دریافت همه ابزارهای رسم از بسته MediaPipe Python استفاده می شود و دوم mp_pose است که برای وارد کردن مدل Pose estimation استفاده می شود.

mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose

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

def findPosition(image, draw=True):
  lmList = []
  if results.pose_landmarks:
      mp_drawing.draw_landmarks(
         image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
      for id, lm in enumerate(results.pose_landmarks.landmark):
          h, w, c = image.shape
          cx, cy = int(lm.x * w), int(lm.y * h)
          lmList.append([id, cx, cy])
  return lmList

سپس جریان ویدئو را از دوربین رزبری پای دریافت کنید. به جای استفاده از پخش زنده ، حتی می توانید از ویدئوی از پیش ضبط شده استفاده کنید. برای این منظور “0” را با مسیر ویدیو جایگزین کنید.

cap = cv2.VideoCapture(0)
#cap = cv2.VideoCapture(“My Video.mp4”)

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

با mp_pose.Pose (min_detection_confidence = 0.7 ، min_track_confidence = 0.7) به عنوان ژست:

  while cap.isOpened():
     success, image = cap.read()
     image = cv2.resize(image, (1280, 720))

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

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)

پس از آن ، ما قصد داریم تصویر را از طریق مدل Pose estimation ارائه دهیم. برای تشخیص و ذخیره نتایج در متغیری به نام “results” ذخیره میکنیم و تصویر BGR را به RGB تبدیل کردیم.

results = pose.process(image)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

اکنون که نتایج تشخیص را دریافت می کنیم ، تابع findPosition() را فرا می گیریم تا این تشخیص ها را روی تصویر ترسیم کرده و با استفاده از ابزارهای نقاشی که قبلاً وارد کردیم ، همه تشخیص ها را متصل کنیم.

mp_drawing.draw_landmarks(image,results.pose_landmarks,mp_pose.POSE_CONNECTIONS)

پس از آن ، شناسه ها و مختصات همه تشخیص ها را در داخل متغیری به نام lmList ذخیره می کنیم.

lmList = findPosition(image, draw=True)

سپس در خطوط بعدی ، ابتدا مختصات هر دو شانه را بدست می آوریم و سپس دایره ها را ترسیم می کنیم. همانطور که در تصویر زیر نشان داده شده است ، شناسه برای شانه های چپ و راست 12 و 11 است.

دستگاه تشخیص شنا سوئدی با رزبری پای

    if len(lmList) != 0:
      cv2.circle(image, (lmList[12][1], lmList[12][2]), 20, (0, 0, 255), cv2.FILLED)
      cv2.circle(image, (lmList[11][1], lmList[11][2]), 20, (0, 0, 255), cv2.FILLED)
      cv2.circle(image, (lmList[12][1], lmList[12][2]), 20, (0, 0, 255), cv2.FILLED)
      cv2.circle(image, (lmList[11][1], lmList[11][2]), 20, (0, 0, 255), cv2.FILLED)

اکنون ، وقتی مختصات شانه ها را پیدا کردیم ، این مختصات را با مختصات هر دو آرنج مقایسه می کنیم. بنابراین ، اگر شانه ها در سطح آرنج یا زیر آرنج قرار داشته باشند ، ما سطح را “Down” قرار می دهیم و وقتی شانه ها بالای آرنج قرار دارند ، سطح به up تغییر کرده و به عنوان یک شنا حساب می شود.

      if (lmList[12][2] and lmList[11][2] >= lmList[14][2] and lmList[13][2]):
        cv2.circle(image, (lmList[12][1], lmList[12][2]), 20, (0, 255, 0), cv2.FILLED)
        cv2.circle(image, (lmList[11][1], lmList[11][2]), 20, (0, 255, 0), cv2.FILLED)
        stage = "down"
      if (lmList[12][2] and lmList[11][2] <= lmList[14][2] and lmList[13][2]) and stage == "down":
        stage = "up"
        counter += 1
        print(counter)

ما تعداد شنا های انجام شده را محاسبه میکنیم و در روی تصویر قرار میدهیم.

text = "{}:{}".format("Push Ups", counter)
    cv2.putText(image, text, (10, 40), cv2.FONT_HERSHEY_SIMPLEX,
                1, (255, 0, 0), 2)
    cv2.imshow('MediaPipe Pose', image)

در نهایت ، ما جریان ویدئو را در پوشه پروژه خود ذخیره می کنیم.

    if create is None:
      fourcc = cv2.VideoWriter_fourcc(*'XVID')
      create = cv2.VideoWriter(opname, fourcc, 30, (image.shape[1], image.shape[0]), True)
    create.write(image)

آزمایش پروژه شمارنده شنا سوئدی با رزبری پای

اکنون که اسکریپت شمارنده شنا آماده است ، بیایید پیش برویم و آن را آزمایش کنیم. دو روش تست وجود دارد. یا می توانید از یک فیلم ضبط شده از قبل استفاده کنید یا می توانید از دوربین Pi برای پخش مستقیم ویدئو استفاده کنید. در اینجا ما از ماژول دوربین Pi استفاده می کنیم ، بنابراین ماژول دوربین Raspberry Pi Camera را مانند Pi به شکل زیر وصل کنید:

اتصال دوربین به برد رزبری پای برای شنا

اکنون ، بررسی کنید که دوربین Pi کار می کند یا خیر. پس از بازبینی دوربین ، اسکریپت پایتون را راه اندازی کنید و پنجره ای را مشاهده خواهید کرد که فید ویدیویی شما در آن ظاهر می شود. در حین انجام حرکت های کششی ابتدا نقاط روی شانه ها قرمز رنگ می شوند:

تشخیص بالا بودن شنا در رزبری پای

و وقتی شانه ها زیر آرنج قرار دارند ، نقاط از سبز به قرمز تغییر کرده و تعداد شنا را یک عدد افزایش می دهند.

نحوه تشخیص حرکات ورزشی با رزبری پای

به این ترتیب می توانید از MediaPipe برای شمارش شنا استفاده کنید. همچنین می توانید از این کتابخانه برای شمارش دراز و نشست یا هر ورزش دیگری استفاده کنید.

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

5 (1 نفر)

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

محمد رحیمی

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

2 نظر

    1. سلام عزیز
      فکر نمیکنم مشکلی باشه اما تست نشده باید خودتون امتحان کنید

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

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