From a0769ae5790c49bf3898cabfd0783c799d554699 Mon Sep 17 00:00:00 2001 From: tanglong <842690096@qq.com> Date: Wed, 24 Sep 2025 17:33:09 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Wpf_AiSportsMicrospace/Home.xaml.cs | 88 +++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 25 deletions(-) diff --git a/Wpf_AiSportsMicrospace/Home.xaml.cs b/Wpf_AiSportsMicrospace/Home.xaml.cs index c8db342..d530382 100644 --- a/Wpf_AiSportsMicrospace/Home.xaml.cs +++ b/Wpf_AiSportsMicrospace/Home.xaml.cs @@ -34,7 +34,11 @@ namespace Wpf_AiSportsMicrospace private readonly List _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); + } } }