2021-11-26 22:15:46 [显示全部楼层]
1216浏览
查看: 1216|回复: 0

[项目分享] Mind+Python+Mediapipe项目——AI健身之哑铃

[复制链接]
本帖最后由 云天 于 2021-12-1 17:55 编辑

【项目背景】

    平时缺乏锻炼,爱好各种美食,没有管理好热量输入的人,身材也容易随着年龄的增长而发胖,身体健康也会更容易出现问题。

    健身锻炼是预防肥胖的有效手段,还能帮你强化体能,提高自身免疫力。很多人总是等到胖起来才想到要锻炼,但是这个时候,你的体能素质已经直线下降,很多运动是无法驾驭得了的,这个时候你更容易放弃健身,选择中途而废。

    不过,很多人出于各种生活、工作的原因,没有时间锻炼,无法在户外锻炼或者去健身房锻炼,只能利用琐碎时间在家锻炼。

    很多人之所以健身锻炼不久就放弃了,绝大多数就是因为太枯燥了,要是能够采取丰富多彩的训练方式,相信很多人一定可以坚持下来的。

【项目设计】

    本项目以使用哑铃健身为例。通过AI识别人体姿态,灯光响应完成度,增加锻炼趣味性,让健身者乐于锻炼。

【锻炼工具哑铃】

    哑铃是一种用于增强肌肉力量训练的简单器材。很多朋友在健身或者锻炼的时候,都会使用到哑铃。

    如:单臂弯举

    目标肌群:肱二头肌、肱肌和肱桡肌。动作要领:稳坐于长凳上,保持大腿与地面平行,低手抓握哑铃,肘部靠近大腿内侧,并高于膝盖位置,手肘靠在大腿内侧做弯举动作。如果哑铃重量比较重,切记不要用甩的方式,避免手臂受伤。

【Mediapipe+Pinpong库安装】

    MediaPipe 是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。在谷歌,一系列重要产品,如 YouTube、Google Lens、ARCore、Google Home 以及 Nest,都已深度整合了 MediaPipe。

2021_0109_d728a471g00qmngmq0592d200ia00a7g00ia00a7.gif

安装过程请参考:https://mc.dfrobot.com.cn/thread-311477-1-1.html

【姿态识别测试】

    使用Mediapipe开源代码,对网络跳舞视频进行姿态识别测试。

    测试代码:
  1. import cv2
  2. import mediapipe as mp
  3. mp_drawing = mp.solutions.drawing_utils
  4. mp_pose = mp.solutions.pose
  5. # For webcam input:
  6. cap = cv2.VideoCapture("wudao4.mp4")
  7. with mp_pose.Pose(
  8.     min_detection_confidence=0.5,
  9.     min_tracking_confidence=0.5) as pose:
  10.   while cap.isOpened():
  11.     success, image = cap.read()
  12.     if not success:
  13.       print("Ignoring empty camera frame.")
  14.       # If loading a video, use 'break' instead of 'continue'.
  15.       continue
  16.     # To improve performance, optionally mark the image as not writeable to
  17.     # pass by reference.
  18.     image.flags.writeable = False
  19.     image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
  20.     results = pose.process(image)
  21.     # Draw the pose annotation on the image.
  22.     image.flags.writeable = True
  23.     image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
  24.     mp_drawing.draw_landmarks(
  25.         image,
  26.         results.pose_landmarks,
  27.         mp_pose.POSE_CONNECTIONS)
  28.     # Flip the image horizontally for a selfie-view display.
  29.     cv2.imshow('MediaPipe Pose', cv2.flip(image, 1))
  30.     if cv2.waitKey(5) & 0xFF == 27:
  31.       break
  32. cap.release()
复制代码
测试视频

【手臂姿态测试】
    在“PoseModule.py”文件中定义类“poseDetector”状态检测,代码如下:
  1. import math
  2. import mediapipe as mp
  3. import cv2
  4. class poseDetector():
  5.     def __init__(self, mode=False, upBody=False, smooth=True,
  6.                  detectionCon=0.5, trackCon=0.5):
  7.         self.mode = mode
  8.         self.upBody = upBody
  9.         self.smooth = smooth
  10.         self.detectionCon = detectionCon
  11.         self.trackCon = trackCon
  12.         self.mpDraw = mp.solutions.drawing_utils
  13.         self.mpPose = mp.solutions.pose
  14.         self.pose = self.mpPose.Pose(self.mode, self.upBody, self.smooth,
  15.                                      self.detectionCon, self.trackCon)
  16.     def findPose(self, img, draw=True):
  17.         imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  18.         self.results = self.pose.process(imgRGB)
  19.         if self.results.pose_landmarks:
  20.             if draw:
  21.                 self.mpDraw.draw_landmarks(img, self.results.pose_landmarks,
  22.                                            self.mpPose.POSE_CONNECTIONS)
  23.         return img
  24.     def findPosition(self, img, draw=True):
  25.         self.lmList = []
  26.         if self.results.pose_landmarks:
  27.             for id, lm in enumerate(self.results.pose_landmarks.landmark):
  28.                 h, w, c = img.shape
  29.                 # print(id, lm)
  30.                 cx, cy = int(lm.x * w), int(lm.y * h)
  31.                 self.lmList.append([id, cx, cy])
  32.                 if draw:
  33.                     cv2.circle(img, (cx, cy), 5, (255, 0, 0), cv2.FILLED)
  34.         return self.lmList
  35.     def findAngle(self, img, p1, p2, p3, draw=True):
  36.         # Get the landmarks
  37.         x1, y1 = self.lmList[p1][1:]
  38.         x2, y2 = self.lmList[p2][1:]
  39.         x3, y3 = self.lmList[p3][1:]
  40.         # Calculate the Angle
  41.         angle = math.degrees(math.atan2(y3 - y2, x3 - x2) -
  42.                              math.atan2(y1 - y2, x1 - x2))
  43.         if angle < 0:
  44.             angle += 360
  45.         # print(angle)
  46.         # Draw
  47.         if draw:
  48.             cv2.line(img, (x1, y1), (x2, y2), (255, 255, 255), 3)
  49.             cv2.line(img, (x3, y3), (x2, y2), (255, 255, 255), 3)
  50.             cv2.circle(img, (x1, y1), 10, (0, 0, 255), cv2.FILLED)
  51.             cv2.circle(img, (x1, y1), 15, (0, 0, 255), 2)
  52.             cv2.circle(img, (x2, y2), 10, (0, 0, 255), cv2.FILLED)
  53.             cv2.circle(img, (x2, y2), 15, (0, 0, 255), 2)
  54.             cv2.circle(img, (x3, y3), 10, (0, 0, 255), cv2.FILLED)
  55.             cv2.circle(img, (x3, y3), 15, (0, 0, 255), 2)
  56.             cv2.putText(img, str(int(angle)), (x2 - 50, y2 + 50),
  57.                         cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 255), 2)
  58.         return angle
复制代码
   测试手臂姿态代码:
  1. import numpy as np
  2. import time
  3. import PoseModule as pm
  4. import cv2
  5. cap = cv2.VideoCapture(0)
  6. detector = pm.poseDetector()
  7. count = 0
  8. dir = 0
  9. pTime = 0
  10. success=True
  11. while success:
  12.     success, img = cap.read()
  13.     img = cv2.resize(img, (640, 480))
  14.     img = detector.findPose(img, False)
  15.     lmList = detector.findPosition(img, False)
  16.    
  17.     if len(lmList) != 0:
  18.         # 右臂
  19.         angle = detector.findAngle(img, 12, 14, 16)
  20.         # 左臂
  21.         #angle = detector.findAngle(img, 11, 13, 15,False)
  22.         per = np.interp(angle, (210, 310), (0, 100))
  23.         light = int(np.interp(angle, (220, 310), (119, 0)))
  24.         # print(angle, per)
  25.         # 计算个数
  26.         
  27.         if per == 100:
  28.             
  29.             if dir == 0:
  30.                 count += 0.5
  31.                 dir = 1
  32.         if per == 0:
  33.             
  34.             if dir == 1:
  35.                 count += 0.5
  36.                 dir = 0
  37.         #print(count)
  38.         cv2.putText(img, str(int(count)), (45, 460), cv2.FONT_HERSHEY_PLAIN, 7,(255, 0, 0), 8)
  39.     cTime = time.time()
  40.     fps = 1 / (cTime - pTime)
  41.     pTime = cTime
  42.     cv2.putText(img, str(int(fps)), (50, 100), cv2.FONT_HERSHEY_PLAIN, 5,(255, 0, 0), 5)
  43.     cv2.imshow("Image", img)
  44.     cv2.waitKey(1)
复制代码

QQ截图20211126093056.png

【Pinpong库测试】


测试代码:
  1. # -*- coding: utf-8 -*-
  2. #实验效果:控制WS2812单线RGB LED灯
  3. #接线:使用windows或linux电脑连接一块microbit主控板,ws2812灯接到D9口
  4. import time
  5. from pinpong.board import Board,Pin,NeoPixel
  6. NEOPIXEL_PIN = Pin.P0
  7. PIXELS_NUM = 120 #灯数
  8. Board("microbit").begin()  #初始化,选择板型和端口号,不输入端口号则进行自动识别
  9. #Board("microbit","COM36").begin()  #windows下指定端口初始化
  10. #Board("microbit","/dev/ttyACM0").begin()   #linux下指定端口初始化
  11. #Board("microbit","/dev/cu.usbmodem14101").begin()   #mac下指定端口初始化
  12. np = NeoPixel(Pin(NEOPIXEL_PIN), PIXELS_NUM)
  13. while True:
  14.   np[0] = (0, 255 ,0) #设置第一个灯RGB亮度
  15.   np[1] = (255, 0, 0) #设置第二个灯RGB亮度
  16.   np[2] = (0, 0, 255) #设置第三个灯RGB亮度
  17.   np[3] = (255, 0, 255) #设置第四个灯RGB亮度
  18.   time.sleep(1)
  19.   np[1] = (0, 255, 0)
  20.   np[2] = (255, 0, 0)
  21.   np[3] = (255, 255, 0)
  22.   np[0] = (0, 0, 255)
  23.   time.sleep(1)
  24.   np.rainbow(0,PIXELS_NUM,0,0x0000FF)
  25.   time.sleep(1)
  26.   for i in range(PIXELS_NUM):
  27.     np.rotate(1)
  28.     time.sleep(1)
  29.   for i in range(PIXELS_NUM):
  30.     np.shift(1)
  31.     time.sleep(1)
  32.   np.clear()
  33.   time.sleep(1)
  34.   np.range_color(0,PIXELS_NUM,0xFF0000)
  35.   time.sleep(1)
  36.   np.range_color(0,PIXELS_NUM,0x00FF00)
  37.   time.sleep(1)  
  38.   np.range_color(0,PIXELS_NUM,0x0000FF)
  39.   time.sleep(1)
  40.   
  41.   np.clear()
  42.   time.sleep(1)
  43.   
复制代码


529564831.jpg




【完整程序】

  1. import numpy as np
  2. import time
  3. import PoseModule as pm
  4. import cv2
  5. import time
  6. from pinpong.board import Board,Pin,NeoPixel
  7. NEOPIXEL_PIN = Pin.P0
  8. PIXELS_NUM = 120 #灯数
  9. Board("microbit").begin()  #初始化
  10. cap = cv2.VideoCapture(0)
  11. detector = pm.poseDetector()
  12. count = 0
  13. dir = 0
  14. pTime = 0
  15. npX = NeoPixel(Pin(NEOPIXEL_PIN), PIXELS_NUM)
  16. success=True
  17. npX.clear()
  18. time.sleep(1)
  19. while success:
  20.     success, img = cap.read()
  21.     img = cv2.resize(img, (640, 480))
  22.     img = detector.findPose(img, False)
  23.     lmList = detector.findPosition(img, False)
  24.    
  25.     if len(lmList) != 0:
  26.         # 右臂
  27.         angle = detector.findAngle(img, 12, 14, 16)
  28.         # 左臂
  29.         #angle = detector.findAngle(img, 11, 13, 15,False)
  30.         per = np.interp(angle, (210, 310), (0, 100))
  31.         light = int(np.interp(angle, (220, 310), (119, 0)))
  32.         # print(angle, per)
  33.         # 计算个数
  34.         
  35.         if per == 100:
  36.             
  37.             if dir == 0:
  38.                 count += 0.5
  39.                 dir = 1
  40.         if per == 0:
  41.             
  42.             if dir == 1:
  43.                 count += 0.5
  44.                 dir = 0
  45.         #print(count)
  46.         #npX.range_color(light,119,0x000000)
  47.         #npX.range_color(0,light,0xFF0000)
  48.         print(light)
  49.         npX.range_color(light,119,0x000000)
  50.         npX.rainbow(0,light,0,0x0000FF)
  51.         cv2.putText(img, str(int(count)), (45, 460), cv2.FONT_HERSHEY_PLAIN, 7,(255, 0, 0), 8)
  52.     cTime = time.time()
  53.     fps = 1 / (cTime - pTime)
  54.     pTime = cTime
  55.     cv2.putText(img, str(int(fps)), (50, 100), cv2.FONT_HERSHEY_PLAIN, 5,(255, 0, 0), 5)
  56.     cv2.imshow("Image", img)
  57.     cv2.waitKey(1)
复制代码

【演示视频】

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail