using OpenCVForUnity.CoreModule; using System; using System.Collections.Generic; using UnityEngine; public class HandsUp : PoseBase { public override Vector2 GetBasicVectorDirection(List startPoint, List endPoint) { //必要点位 "RShoulder", "LShoulder", "RElbow", "LElbow" //计算肩膀到手肘矢量,右手 Vector2 rightHandVector = GetAverageVector(startPoint, endPoint, "RElbow"); Vector2 leftHandVector = GetAverageVector(startPoint, endPoint, "LElbow"); //平均矢量 Vector2 averageVector = (rightHandVector + leftHandVector) / 2; //如果左右手肘矢量差小于两者平均值的0.3倍,且左右手矢量夹角小于30度,返回左右手矢量平均值 if ((rightHandVector - leftHandVector).magnitude < averageVector.magnitude * 0.3f && Vector2.Angle(rightHandVector, leftHandVector) < 30) { return averageVector; } return Vector2.zero; } protected override bool IsMovePoint(string tagName) { return "RWrist".Equals(tagName) || "LWrist".Equals(tagName); } public override void ValidationMovement(Vector2 distance, TimeSpan totalTimeSpan, int level) { if (totalTimeSpan.TotalMilliseconds / 1000 < 0.05f) { LogPrint.Error("TimeSpan too short"); return; } var angle = Vector2.SignedAngle(Vector2.up, distance); LogPrint.Log($"Angle:{angle}", PrintLevel.Normal); if (MathF.Abs(angle) < 10) EventManager.Instance.Dispatch(YogaEventType.Action_Success); //方向不能偏移超过10° else { EventManager.Instance.Dispatch(YogaEventType.Action_Fail); return; } if (level < 1) return; LogPrint.Log($"distance x:{distance.x}, y:{distance.y}, magnitude:{distance.magnitude}", PrintLevel.Normal); if (distance.magnitude > 80f || distance.magnitude < 20f) EventManager.Instance.Dispatch(YogaEventType.Action_MoveDistanceNotAccurate); else EventManager.Instance.Dispatch(YogaEventType.Action_MoveDistanceExactly); if (level < 2) return; var speed = distance.magnitude / totalTimeSpan.TotalSeconds; LogPrint.Log($"speed:{speed}", PrintLevel.Normal); if (speed > 0.5f) EventManager.Instance.Dispatch(YogaEventType.Action_SpeedTooFast); //速度语音提示 else if (speed < 0.1f) EventManager.Instance.Dispatch(YogaEventType.Action_SpeedTooSlow); //速度语音提示 } public override void ExcellenceEstimate(List<(TimeSpan, Vector2)> frameData, Vector2 distance, TimeSpan totalTimeSpan) { throw new NotImplementedException(); } }