如何实现基于mediapipe的姿态识别和简单行为识别

如何实现基于mediapipe的姿态识别和简单行为识别 如何实现基于mediapipe的姿态识别和简单行为识别代码及文字仅供参考文章目录示例代码代码解释示例代码代码解释1、可以识别到人体姿态关键点2、可以通过角度识别的方法识别到人体的动作自定义要实现基于MediaPipe的姿态识别和简单行为识别可以分为以下几个步骤安装MediaPipe确保你已经安装了MediaPipe。你可以使用以下命令进行安装pipinstallmediapipe检测人体姿态关键点使用MediaPipe的Pose模块来检测人体姿态的关键点。计算关节角度根据检测到的关键点计算关节的角度。定义动作识别逻辑根据关节角度判断特定的动作。实时处理视频流从摄像头或视频文件中实时获取帧并进行处理。示例代码下面是一个完整的示例代码展示了如何使用MediaPipe检测姿态关键点并通过角度识别方法识别简单的动作如挥手。importcv2importmediapipeasmpimportmath# 初始化MediaPipe Pose模型mp_drawingmp.solutions.drawing_utils mp_posemp.solutions.posedefcalculate_angle(a,b,c):Calculate the angle between three points.anp.array(a)# Firstbnp.array(b)# Midcnp.array(c)# Endradiansnp.arctan2(c[1]-b[1],c[0]-b[0])-np.arctan2(a[1]-b[1],a[0]-b[0])anglenp.abs(radians*180.0/np.pi)ifangle180.0:angle360-anglereturnangledefdetect_wave(hand_landmarks):Detect waving action based on hand landmarks.# Define the threshold for wavingthreshold30# Calculate angles between key pointswristhand_landmarks.landmark[mp_pose.PoseLandmark.WRIST]thumb_mcphand_landmarks.landmark[mp_pose.PoseLandmark.THUMB_MCP]thumb_tiphand_landmarks.landmark[mp_pose.PoseLandmark.THUMB_TIP]wrist_thumb_mcp_anglecalculate_angle(wrist,thumb_mcp,thumb_tip)# Check if the angle is above the thresholdifwrist_thumb_mcp_anglethreshold:returnTrueelse:returnFalsedefmain():capcv2.VideoCapture(0)withmp_pose.Pose(min_detection_confidence0.5,min_tracking_confidence0.5)aspose:whilecap.isOpened():ret,framecap.read()# Convert the image to RGBimagecv2.cvtColor(frame,cv2.COLOR_BGR2RGB)image.flags.writeableFalse# Make detectionresultspose.process(image)# Draw the landmarks on the imageimage.flags.writeableTrueimagecv2.cvtColor(image,cv2.COLOR_RGB2BGR)mp_drawing.draw_landmarks(image,results.pose_landmarks,mp_pose.POSE_CONNECTIONS,mp_drawing.DrawingSpec(color(245,117,66),thickness2,circle_radius2),mp_drawing.DrawingSpec(color(245,66,230),thickness2,circle_radius2))# Detect waving actionifresults.pose_landmarks:wavingdetect_wave(results.pose_landmarks)ifwaving:cv2.putText(image,Waving,(10,70),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2,cv2.LINE_AA)# Display the resulting framecv2.imshow(Mediapipe Pose,image)ifcv2.waitKey(10)0xFFord(q):breakcap.release()cv2.destroyAllWindows()if__name____main__:main()代码解释安装MediaPipepipinstallmediapipe初始化MediaPipe Pose模型mp_drawingmp.solutions.drawing_utils mp_posemp.solutions.pose计算关节角度defcalculate_angle(a,b,c):anp.array(a)bnp.array(b)cnp.array(c)radiansnp.arctan2(c[1]-b[1],c[0]-b[0])-np.arctan2(a[1]-b[1],a[0]-b[0])anglenp.abs(radians*180.0/np.pi)ifangle180.0:angle360-anglereturnangle定义动作识别逻辑defdetect_wave(hand_landmarks):threshold30wristhand_landmarks.landmark[mp_pose.PoseLandmark.WRIST]thumb_mcphand_landmarks.landmark[mp_pose.PoseLandmark.THUMB_MCP]thumb_tiphand_landmarks.landmark[mp_pose.PoseLandmark.THUMB_TIP]wrist_thumb_mcp_anglecalculate_angle(wrist,thumb_mcp,thumb_tip)ifwrist_thumb_mcp_anglethreshold:returnTrueelse:returnFalse实时处理视频流capcv2.VideoCapture(0)withmp_pose.Pose(min_detection_confidence0.5,min_tracking_confidence0.5)aspose:whilecap.isOpened():ret,framecap.read()imagecv2.cvtColor(frame,cv2.COLOR_BGR2RGB)image.flags.writeableFalseresultspose.process(image)image.flags.writeableTrueimagecv2.cvtColor(image,cv2.COLOR_RGB2BGR)mp_drawing.draw_landmarks(image,results.pose_landmarks,mp_pose.POSE_CONNECTIONS,mp_drawing.DrawingSpec(color(245,117,66),thickness2,circle_radius2),mp_drawing.DrawingSpec(color(245,66,230),thickness2,circle_radius2))ifresults.pose_landmarks:wavingdetect_wave(results.pose_landmarks)ifwaving:cv2.putText(image,Waving,(10,70),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2,cv2.LINE_AA)cv2.imshow(Mediapipe Pose,image)ifcv2.waitKey(10)0xFFord(q):breakcap.release()cv2.destroyAllWindows()这个示例代码展示了如何使用MediaPipe检测姿态关键点并通过角度识别方法识别简单的动作如挥手。同学可根据需要调整阈值和其他参数来识别不同的动作。要实现基于MediaPipe的姿态识别并通过角度识别方法识别特定的动作如“举双手”、“比三角形”、“叉腰”等可以按照以下步骤进行安装MediaPipe确保你已经安装了MediaPipe。你可以使用以下命令进行安装pipinstallmediapipe检测人体姿态关键点使用MediaPipe的Pose模块来检测人体姿态的关键点。计算关节角度根据检测到的关键点计算关节的角度。定义动作识别逻辑根据关节角度判断特定的动作。实时处理视频流从摄像头或视频文件中实时获取帧并进行处理。示例代码下面是一个完整的示例代码展示了如何使用MediaPipe检测姿态关键点并通过角度识别方法识别特定的动作如“举双手”、“比三角形”、“叉腰”等。importcv2importmediapipeasmpimportmath# 初始化MediaPipe Pose模型mp_drawingmp.solutions.drawing_utils mp_posemp.solutions.posedefcalculate_angle(a,b,c):Calculate the angle between three points.anp.array(a)# Firstbnp.array(b)# Midcnp.array(c)# Endradiansnp.arctan2(c[1]-b[1],c[0]-b[0])-np.arctan2(a[1]-b[1],a[0]-b[0])anglenp.abs(radians*180.0/np.pi)ifangle180.0:angle360-anglereturnangledefdetect_actions(landmarks):Detect specific actions based on landmarks.threshold30# Define key points for different actionsleft_shoulderlandmarks.landmark[mp_pose.PoseLandmark.LEFT_SHOULDER]right_shoulderlandmarks.landmark[mp_pose.PoseLandmark.RIGHT_SHOULDER]left_elbowlandmarks.landmark[mp_pose.PoseLandmark.LEFT_ELBOW]right_elbowlandmarks.landmark[mp_pose.PoseLandmark.RIGHT_ELBOW]left_wristlandmarks.landmark[mp_pose.PoseLandmark.LEFT_WRIST]right_wristlandmarks.landmark[mp_pose.PoseLandmark.RIGHT_WRIST]left_hiplandmarks.landmark[mp_pose.PoseLandmark.LEFT_HIP]right_hiplandmarks.landmark[mp_pose.PoseLandmark.RIGHT_HIP]# Calculate anglesleft_arm_anglecalculate_angle(left_shoulder,left_elbow,left_wrist)right_arm_anglecalculate_angle(right_shoulder,right_elbow,right_wrist)hip_anglecalculate_angle(left_hip,(left_hipright_hip)/2,right_hip)# Detect actionsifleft_arm_anglethresholdandright_arm_anglethreshold:return举双手elifleft_arm_angle150andright_arm_angle150:return比三角形elifhip_angle150:return叉腰else:return正常defmain():capcv2.VideoCapture(0)withmp_pose.Pose(min_detection_confidence0.5,min_tracking_confidence0.5)aspose:whilecap.isOpened():ret,framecap.read()# Convert the image to RGBimagecv2.cvtColor(frame,cv2.COLOR_BGR2RGB)image.flags.writeableFalse# Make detectionresultspose.process(image)# Draw the landmarks on the imageimage.flags.writeableTrueimagecv2.cvtColor(image,cv2.COLOR_RGB2BGR)mp_drawing.draw_landmarks(image,results.pose_landmarks,mp_pose.POSE_CONNECTIONS,mp_drawing.DrawingSpec(color(245,117,66),thickness2,circle_radius2),mp_drawing.DrawingSpec(color(245,66,230),thickness2,circle_radius2))# Detect actionsifresults.pose_landmarks:actiondetect_actions(results.pose_landmarks)cv2.putText(image,action,(10,70),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2,cv2.LINE_AA)# Display the resulting framecv2.imshow(Mediapipe Pose,image)ifcv2.waitKey(10)0xFFord(q):breakcap.release()cv2.destroyAllWindows()if__name____main__:main()代码解释安装MediaPipepipinstallmediapipe初始化MediaPipe Pose模型mp_drawingmp.solutions.drawing_utils mp_posemp.solutions.pose计算关节角度defcalculate_angle(a,b,c):anp.array(a)bnp.array(b)cnp.array(c)radiansnp.arctan2(c[1]-b[1],c[0]-b[0])-np.arctan2(a[1]-b[1],a[0]-b[0])anglenp.abs(radians*180.0/np.pi)ifangle180.0:angle360-anglereturnangle定义动作识别逻辑defdetect_actions(landmarks):threshold30left_shoulderlandmarks.landmark[mp_pose.PoseLandmark.LEFT_SHOULDER]right_shoulderlandmarks.landmark[mp_pose.PoseLandmark.RIGHT_SHOULDER]left_elbowlandmarks.landmark[mp_pose.PoseLandmark.LEFT_ELBOW]right_elbowlandmarks.landmark[mp_pose.PoseLandmark.RIGHT_ELBOW]left_wristlandmarks.landmark[mp_pose.PoseLandmark.LEFT_WRIST]right_wristlandmarks.landmark[mp_pose.PoseLandmark.RIGHT_WRIST]left_hiplandmarks.landmark[mp_pose.PoseLandmark.LEFT_HIP]right_hiplandmarks.landmark[mp_pose.PoseLandmark.RIGHT_HIP]left_arm_anglecalculate_angle(left_shoulder,left_elbow,left_wrist)right_arm_anglecalculate_angle(right_shoulder,right_elbow,right_wrist)hip_anglecalculate_angle(left_hip,(left_hipright_hip)/2,right_hip)ifleft_arm_anglethresholdandright_arm_anglethreshold:return举双手elifleft_arm_angle150andright_arm_angle150:return比三角形elifhip_angle150:return叉腰else:return正常实时处理视频流capcv2.VideoCapture(0)withmp_pose.Pose(min_detection_confidence0.5,min_tracking_confidence0.5)aspose:whilecap.isOpened():ret,framecap.read()imagecv2.cvtColor(frame,cv2.COLOR_BGR2RGB)image.flags.writeableFalseresultspose.process(image)image.flags.writeableTrueimagecv2.cvtColor(image,cv2.COLOR_RGB2BGR)mp_drawing.draw_landmarks(image,results.pose_landmarks,mp_pose.POSE_CONNECTIONS,mp_drawing.DrawingSpec(color(245,117,66),thickness2,circle_radius2),mp_drawing.DrawingSpec(color(245,66,230),thickness2,circle_radius2))ifresults.pose_landmarks:actiondetect_actions(results.pose_landmarks)cv2.putText(image,action,(10,70),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2,cv2.LINE_AA)cv2.imshow(Mediapipe Pose,image)ifcv2.waitKey(10)0xFFord(q):breakcap.release()cv2.destroyAllWindows()这个示例代码展示了如何使用MediaPipe检测姿态关键点并通过角度识别方法识别特定的动作如“举双手”、“比三角形”、“叉腰”等。你可以根据需要调整阈值和其他参数来识别不同的动作。