本帖最后由 云天 于 2022-2-21 22:34 编辑
【项目背景】
仰卧起坐(sit-up),是一种锻炼身体的方式。长时间锻炼,需要毅力坚持。但也可以让枯燥的运动,变的有乐趣。今天这个项目让人工智能陪我们一起快乐健身。
【项目设计】
使用Mind+Python模式下加载Google的开源Mediapipe人工智能算法库,识别人体姿态,利用动作中躯体大腿的夹角的变化来判断仰卧起坐的个数,并通过物联网控制LED灯实时显示个数、语音合成模块播报个数。
【测试程序】
通过测试程序,获取到腿弯曲角度,躯体动作角度范围。
import numpy as np
import time
import cv2
import PoseModule as pm
cap = cv2.VideoCapture('ywqz2.mp4')
detector = pm.poseDetector()
pTime = 0
success=True
while success:
success, img = cap.read()
if success:
img = cv2.resize(img, (640, 480))
img = detector.findPose(img, False)
lmList = detector.findPosition(img, False)
if len(lmList) != 0:
angle2=detector.findAngle(img, 12, 24, 26)
angle3=detector.findAngle(img, 24, 26, 28)
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, str(int(fps)), (50, 100), cv2.FONT_HERSHEY_PLAIN, 5,(255, 0, 0), 5)
cv2.imshow("Image", img)
cv2.waitKey(1)
cap.release()
cv2.destroyAllWindows()
复制代码
【个数朗读】
使用pyttsx3库文字转语音,播报“仰卧起坐”个数。
在Mind+Python模式下,使用“库管理——推荐库”进行安装。
import numpy as np
import time
import cv2
import PoseModule as pm
import pyttsx3
engine = pyttsx3.init()
cap = cv2.VideoCapture('ywqz2.mp4')
detector = pm.poseDetector()
count = 0
dir = 0
pTime = 0
success=True
countpre=0
while success:
success, img = cap.read()
if success:
img = cv2.resize(img, (640, 480))
img = detector.findPose(img, False)
lmList = detector.findPosition(img, False)
if len(lmList) != 0:
#身体弯曲角度
angle2=detector.findAngle(img, 12, 24, 26) 复制代码
由于使用“engine.runAndWait() ”这条语句,所以在“起坐”过程中,当次数有变化时,因朗读次数,而使得程序停滞在朗读处,等待朗读结束。现象是窗口画面会停滞不动。请看以下测试视频:
【利用物联网】
刚开始准备使用Pinpong库解决以上问题。但由于运行者需侧身对着摄像头(笔记本自带),又有一定的距离,如果使用Pinpong库驱动彩灯和发声模块,势必要使用很长的数据线,才能让使用者看到效果。所以采用Python+Easy IOT物联网技术,无线传输数据。让Arduino 通过物联网模块接收数据,通过语音合成模块播放个数数据,并用LED灯显示个数。
1、Easy IOT 设置,获取参数
2、组装硬件
4、编写并上传程序
Arduino,通过物联网模块接收物联网发送过来的数字,并通过语音合成模块播报出来,且通过LED灯显示。
【Mind+Python主程序】
连接物联网Easy IOT,当个数发生改变后,向物联网发送个数。
import numpy as np
import time
import cv2
import PoseModule as pm
import siot
siot.init(client_id="SyWH2Af2sV",server="iot.dfrobot.com.cn",port=1883,user="X8jykxFnR",password="u8jskbFngz")
siot.connect()
siot.loop()
cap = cv2.VideoCapture(0)
detector = pm.poseDetector()
count = 0
dir = 0
pTime = 0
success=True
countpre=0
while success:
success, img = cap.read()
if success:
img = cv2.resize(img, (640, 480))
img = detector.findPose(img, False)
lmList = detector.findPosition(img, False)
if len(lmList) != 0:
#身体弯曲角度
angle2=detector.findAngle(img, 12, 24, 26)
angle3=detector.findAngle(img, 24, 26, 28)
if angle3>270:
if angle2 >130:
if dir == 0:
count += 0.5
dir = 1
if angle2 < 80:
if dir == 1:
count += 0.5
dir = 0
if countpre!=int(count):
countpre=int(count)
siot.publish(topic="5n92uqBMg", data=str(int(count)))
print(int(count))
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, str(int(count)), (50, 450), cv2.FONT_HERSHEY_PLAIN, 5,(255, 0, 0), 5)
cv2.putText(img, str(int(fps)), (50, 100), cv2.FONT_HERSHEY_PLAIN, 5,(255, 255, 0), 5)
cv2.imshow("Image", img)
cv2.waitKey(1)
cap.release()
cv2.destroyAllWindows()
复制代码
【演示视频】
1、语音合成声音较小,在现场因为在身边听得清楚,电脑录进的声音较小,需要仔细听。2、由于将脚放入垫子里,所以人工智能一直在找脚的位置,看来还不是很聪明。
备注:
存在脊柱损伤风险
动作到位的仰卧起坐会牵涉到臀肌和腹肌,这样就需要弓背,很容易导致脊柱受损。这种风险不仅对于腹肌力量差的人是存在的,而且对于那些经常锻炼的人亦然。他们训练任务中需要作足够多的仰卧起坐使腹肌极度疲劳,而这也可能导致脊柱损伤。除去这些风险,臀肌施加的杠杆力也会压迫腰椎间盘。美军很多部队的训练中已经去除了仰卧起坐,因为经测试发现仰卧起坐会导致背部损伤,以及因脊髓受压迫而引起的疼痛或麻木。