using OpenCVForUnity.CoreModule; using System; using System.Collections.Generic; using System.Linq; using UnityEngine; public class HoldPosition : PoseBase { public override bool? AnalyzingAction(List<(DateTime, List)> points, bool isDataReGather = false) { if (points.Count < 2) // 0级实现逻辑 不做操作 return null; float distance = 0; TimeSpan totalTimeSpan = TimeSpan.MinValue; var startPoint = points.FirstOrDefault().Item2; var endPoint = points.LastOrDefault().Item2; var startDir = "Nose".vector(startPoint) - "Neck".vector(startPoint); var endDir = "Nose".vector(endPoint) - "Neck".vector(endPoint); var angle = Vector2.SignedAngle(startDir, endDir); for (int i = 0; i < points.Count - 1; i++) { var p1 = points[i].Item2; var p2 = points[i + 1].Item2; var vector = GetBasicVectorDirection(p1, p2); distance += vector.magnitude; TimeSpan timeSpan = points[i + 1].Item1 - points[i].Item1; totalTimeSpan = timeSpan; } LogPrint.Warning($"angle: {angle}", PrintLevel.Normal); LogPrint.Log($"distance: {distance}, totalTimeSpan: {totalTimeSpan}", PrintLevel.Normal); return (angle < 8 && (distance/ points.Count < 8f)); } public override Vector2 GetBasicVectorDirection(List startPoint, List endPoint) { List vectors = new List(); //必要点位 Nose Neck //计算鼻子到头颈矢量 //return GetAverageVector(startPoint, endPoint, "Nose"); return GetTwoPointAverageVector(startPoint, endPoint, "Nose", "Neck"); } protected override bool IsMovePoint(string tagName) { return "Nose" == tagName || "REye" == tagName || "LEye" == tagName || "REar" == tagName || "LEar" == tagName; } public override bool? MovementValidation(Vector2 distance, TimeSpan totalTimeSpan, int level) { if (totalTimeSpan.TotalMilliseconds / 1000 < 0.05f) { LogPrint.Error("TimeSpan too short"); return null; } //保持姿势不发生移动 if (distance.magnitude < 10f)//允许一定误差 { //EventManager.Instance.Dispatch(YogaEventType.Action_Success); return true; } else { LogPrint.Warning($"Hold Position, magnitude:{distance.magnitude}", PrintLevel.Important); //EventManager.Instance.Dispatch(YogaEventType.Action_Fail); return false; } } public override void ExcellenceEstimate(List<(TimeSpan, Vector2)> frameData, Vector2 distance, TimeSpan totalTimeSpan) { throw new NotImplementedException(); } }