This commit is contained in:
tanglong 2025-09-24 17:33:09 +08:00
parent e492e408ee
commit a0769ae579

View File

@ -34,7 +34,11 @@ namespace Wpf_AiSportsMicrospace
private readonly List<SportDescriptor> _sports;
private SportBase _sport;
private readonly SportDetectionQueue _detectQueue;
private IPointTracker _tracker;
private IPointTracker _leftTracker;
private IPointTracker _rightTracker;
private IPointTracker _leftElbow;
private IPointTracker _rightElbow;
private WebcamClient _webcamClient;
public Home()
{
@ -63,7 +67,16 @@ namespace Wpf_AiSportsMicrospace
private void Window_Loaded(object sender, RoutedEventArgs e)
{
_tracker = PostureCalculate.CreatePointTracker("left_wrist", 0);
_leftTracker = PostureCalculate.CreatePointTracker("left_wrist", 0);
_rightTracker = PostureCalculate.CreatePointTracker("right_wrist", 0);
_leftElbow = PostureCalculate.CreatePointTracker("left_elbow", 0);
_rightElbow = PostureCalculate.CreatePointTracker("right_elbow", 0);
_leftTracker.Amplitude = 0.05f;
_rightTracker.Amplitude = 0.05f;
_leftElbow.Amplitude = 0.05f;
_rightElbow.Amplitude = 0.05f;
LoadRTSP();
}
@ -74,13 +87,11 @@ namespace Wpf_AiSportsMicrospace
//_sport.Start();
//_detectQueue.Start();
var _webcamClient = WebcamClient.CreateRTSP("192.168.3.64", "admin", "yd708090", 554u);
_webcamClient = WebcamClient.CreateRTSP("192.168.3.64", "admin", "yd708090", 554u);
//处理抽帧回调
_webcamClient.OnExtractFrame += this.OnFrameExtracted;
_webcamClient.StartExtract();//开始抽帧
}
private DateTime _lastSlideTime = DateTime.MinValue;
@ -96,31 +107,42 @@ namespace Wpf_AiSportsMicrospace
{
var buffer = frame.GetImageBuffer(ImageFormat.Jpeg).ToArray();
var humanResult = _humanPredictor.Predicting(buffer, frame.Number);
var human = humanResult?.Humans?.FirstOrDefault();
if (human == null) return;
var tr = _tracker.Tracking(human); // 0 左滑1 右滑
var humans = humanResult?.Humans?.ToList();
if (humans == null || humans.Count == 0)
return;
// 节流:每 500ms 最多更新一次 UI
if ((DateTime.Now - _lastSlideTime).TotalMilliseconds < 300) return;
//var human = humans
// .Where(h =>
// h.Keypoints.Any(kp => kp.Name == "left_ankle" && kp.X < 1020 && kp.Y > 900 && kp.Y < 1020) &&
// h.Keypoints.Any(kp => kp.Name == "right_ankle" && kp.X > 750 && kp.Y > 900 && kp.Y < 1020)
// )
// .FirstOrDefault();
var human = humans.FirstOrDefault();
if (human == null)
return;
var leftResult = _leftTracker.Tracking(human);
var rightResult = _rightTracker.Tracking(human);
var leftElbowResult = _leftElbow.Tracking(human);
var rightElbowResult = _rightElbow.Tracking(human);
// 节流:每 300ms 最多更新一次 UI
if ((DateTime.Now - _lastSlideTime).TotalMilliseconds < 500) return;
_lastSlideTime = DateTime.Now;
Application.Current?.Dispatcher?.BeginInvoke(new Action(() =>
// 根据手势结果选择滑动方向
if (leftResult != 0 && leftElbowResult != 1)
{
try
{
if (tr == 0)
{
//coverFlow.SlideLeft();
}
else if (tr == 1)
coverFlow.SlideRight();
}
catch (Exception ex)
{
Console.WriteLine("UI update error: " + ex.Message);
}
}), System.Windows.Threading.DispatcherPriority.Background);
SlideCoverFlow(coverFlow.SlideRight);
}
if (rightResult != 0 & rightElbowResult != 1)
{
SlideCoverFlow(coverFlow.SlideLeft);
}
}
catch (Exception ex)
{
@ -128,5 +150,21 @@ namespace Wpf_AiSportsMicrospace
}
});
}
// 抽象 UI 更新到方法中
private void SlideCoverFlow(Action slideAction)
{
Application.Current?.Dispatcher?.BeginInvoke(new Action(() =>
{
try
{
slideAction?.Invoke();
}
catch (Exception ex)
{
Console.WriteLine("UI update error: " + ex.Message);
}
}), System.Windows.Threading.DispatcherPriority.Background);
}
}
}