دستگاه شمارنده شنا سوئدی با رزبری پای (پردازش تصویر 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 برای شمارش شنا استفاده کنید. همچنین می توانید از این کتابخانه برای شمارش دراز و نشست یا هر ورزش دیگری استفاده کنید.
موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود
میشه از رزبری پای ۳b یا ۳b+ استفاده کرد؟
سلام عزیز
فکر نمیکنم مشکلی باشه اما تست نشده باید خودتون امتحان کنید