介绍,谷歌发布了一个开源、跨平台、可定制的机器学习解决方案工具包,为在线流媒体提供机器学习解决方案(当然也可以用于普通视频、图片等).有兴趣的同学可以打开这个网站了解详情:https://mediapipe.dev/。它提供...准备工作安装Python3.8.x创建Python工程,推荐使用virtualenv创建工程专用Python环境安装包:Opencv-Python,mediapipe,numpy开始编程创建人体姿态识别模块,在这个模块中,我们使用mediapipe模块实现人体姿态识别,获取姿态数据。importcv2importmediapipeasmpimportmathclassPoseDetector():'''人体姿势检测类'''def__init__(self,static_image_mode=False,upper_body_only=False,smooth_landmarks=True,min_detection_confidence=0.5,min_tracking_confidence='0'5)初始化:paramstatic_image_mode:是否为静态图片,默认为No:paramupper_body_only:是否为上半身,默认为No:paramsmooth_landmarks:设置为True,减少抖动:parammin_detection_confidence:的最小置信度值行人检测模型,默认为0.5:parammin_tracking_confidence:姿态可信标记的最小置信度值,默认为0.5'''self.static_image_mode=static_image_modeself.upper_body_only=upper_body_onlyself.smooth_landmarks=smooth_landmarksself.min_detection_confidenceselfdetection=min_detection.min_tracking_confidence=min_tracking_confidence#创建一个姿势对象用于检测人体姿势self.pose=mp.solutions.pose.Pose(self.static_image_mode,self.upper_body_only,self.smooth_landmarks,self.min_detection_confidence,self.min_tracking_confidence)deffind_pose(self,img,draw=True):'''姿态检测方法:paramimg:一帧图像:paramdraw:是否绘制人体姿态节点和连接图:return:processedimage'''imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#pose.process(imgRGB)会识别出这一帧图片中的人体姿态数据并保存到self.self.resultsinresults=self.pose.process(imgRGB)ifself.results.pose_landmarks:ifdraw:mp.solutions.drawing_utils.draw_landmarks(img,self.results.pose_landmarks,mp.solutions.pose.POSE_CONNECTIONS)返回imgdeffind_positions(self,img):'''获取人体姿态数据:paramimg:一帧图像:paramdraw:是否绘制人体姿态节点和连接图:return:人体姿态数据列表'''#人体姿态数据列表,每个成员由3个数字组成:id,x,y#id代表人体的一个关节点,x和y表示坐标位置数据self.lmslist=[]ifself.results.pose_landmarks:forid,lminenumerate(self.results.pose_landmarks.landmark):h,w,c=img.shapecx,cy=int(lm.x*w),int(lm.y*h)self.lmslist.append([id,cx,cy])返回self.lmslistdeffind_angle(self,img,p1,p2,p3,draw=True):'''获取人体姿势p1-p2-p3三个点的角度:paramimg:一帧图像:paramp1:第一个点:paramp2:第二个点:paramp3:第三个point:paramdraw:是否绘制3个点的连接图:return:angle'''x1,y1=self.lmslist[p1][1],self.lmslist[p1][2]x2,y2=self.lmslist[p2][1],self.lmslist[p2][2]x3,y3=self.lmslist[p3][1],self.lmslist[p3][2]#使用三角函数得到3个点p1-p2-p3,以p2为角度的角度值,在0-180度之间angle=int(math.degrees(math.atan2(y1-y2,x1-x2)-math.atan2(y3-y2,x3-x2)))如果角度<0:角度=角度+360如果角度>180:angle=360-绘制时的角度:cv2.圆(img,(x1,y1),20,(0、255、255),cv2。填充)cv2。圆(img,(x2,y2),30,(255,0,255),cv2。填充)cv2。圆(img,(x3,y3),20,(0、255、255),cv2。填充)cv2。线(img,(x1,y1),(x2,y2),(255,255,255,3))cv2.line(img,(x2,y2),(x3,y3),(255,255,255,3))cv2.putText(img,str(angle),(x2-50,y2+50),cv2.FONT_HERSHEY_SIMPLEX,2,(0,255,255),2)returnangle写situps.py,在这个程序我们会使用opencv读取视频文件,当然你也可以使用摄像头直接拍摄调用人体姿态识别模块来识别视频中的人体姿态并获取姿态数据,通过三个位置的数据在人体姿势中:肩膀(11)、臀部(23)、膝盖(25),计算这3个点的角度,判断仰卧起坐是否达标。#importopencvtoolkitimportcv2#importnumpyimportnumpyasnp#ImportposerecognizerfromposeutilimportPoseDetector#打开视频文件cap=cv2.VideoCapture('videos/situp.mp4')#Poserecognizerdetector=PoseDetector()#方向和数量dir=0#0是躺着,1是坐着count=0whileTrue:#读取摄像头,img是每一帧的成功,img=cap.read()ifsuccess:h,w,c=img.shape#识别姿势img=detector.find_pose(img,draw=True)#获取姿势数据positions=detector.find_positions(img)ifpositions:#获取仰卧起坐的角度angle=detector.find_angle(img,11,23,25)#进度条长度bar=np.interp(angle,(50,130),(w//2-100,w//2+100))cv2.rectangle(img,(w//2-100,h-150),(int(bar),h-100),(0,255,0),cv2.FILLED)#如果角度小于55度,则认为角度<=55为正坐:ifdir==0:count=count+0.5dir=1#角度大于120度视为躺下ifangle>=120:如果迪r==1:count=count+0.5dir=0cv2.putText(img,str(int(count)),(w//2,h//2),cv2.FONT_HERSHEY_SIMPLEX,10,(255,255,255),20,cv2.LINE_AA)#打开一个Image窗口显示视频图像cv2.imshow('Image',img)else:#视频结束退出break#如果按下q键,程序退出键=cv2.waitKey(1)ifkey==ord('q'):break#关闭摄像头cap.release()#关闭程序窗口cv2.destroyAllWindows()运行测试总体感觉mediapipe识别率还是可以的很好,基本上在使用CPU的情况下可以达到每秒25帧。我们可以调整仰卧起坐的判断角度,让这个程序更符合自己的仰卧起坐检测。
