using NUnit.Framework.Internal; using OpenCVForUnity.CoreModule; using OpenCVForUnity.DnnModule; using OpenCVForUnity.UnityUtils; using OpenCVForUnity.UnityUtils.Helper; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using UnityEngine; public class YogaManager : MonoSingleton { private bool _isInited = false; private LinkedList _poseChecks = new LinkedList(); private PoseBase _currPose = null; private double threshold = 0.1; private List _points = new List(); public List Points { get => _points; private set => _points = value; } public Action UpdateStatus { get; internal set; } public Action ShowHint { get; internal set; } public int ActionIndex { get; internal set; } public int CurrentActionCount { get => _currentActionCount; internal set => _currentActionCount = value; } public int CurrentSuccessActionCount { get => _currentSuccessActionCount; internal set => _currentSuccessActionCount = value; } //创建帧数据缓存 private Dictionary>> _framePoints = new (); // actionID, frameID, points private int _currActionID; private int _currentActionCount; private int _currentSuccessActionCount; public void InitData() { _poseChecks.AddFirst(new IsReady(ModelType.OpenPose)); _poseChecks.AddLast(new HeadTurnLeft(ModelType.OpenPose)); _poseChecks.AddLast(new HeadTurnRight(ModelType.OpenPose)); ShowHint?.Invoke(string.Empty); UpdateStatus?.Invoke(string.Empty); _currPose = _poseChecks.First.Value; _currPose.ShowHint(); _currActionID = 0; _isInited = true; _currentActionCount = 0; _currentSuccessActionCount = 0; } public void Dispose() { _currPose = null; UpdateStatus = null; _isInited = false; _poseChecks.Clear(); } public List Process(Mat img, Dictionary models) { List points = models[_currPose.ModelName].estimate(img, (float)threshold).toList(); //_framePoints[_currActionID].Add(points); ProcessPoints(points); return points; } public void ProcessPoints(List points) { if (!_isInited) { InitData(); } Points = points; if (_currPose == null) { _currPose = _poseChecks.First.Value; _currPose.ShowHint(); return; } if (_currPose.CheckPose(points)) { _currPose.ProcessSuccessCallBack(() => { SwitchNextPost(); }); } else { _currPose.ProcessFailCallBack(); } } private void SwitchNextPost() { if (_currPose == _poseChecks.Last.Value) { Dispose(); return; } _currPose = _poseChecks.Find(_currPose).Next.Value; _currPose.ShowHint(); } }