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 readonly List<SportDescriptor> _sports;
private SportBase _sport; private SportBase _sport;
private readonly SportDetectionQueue _detectQueue; private readonly SportDetectionQueue _detectQueue;
private IPointTracker _tracker; private IPointTracker _leftTracker;
private IPointTracker _rightTracker;
private IPointTracker _leftElbow;
private IPointTracker _rightElbow;
private WebcamClient _webcamClient;
public Home() public Home()
{ {
@ -63,7 +67,16 @@ namespace Wpf_AiSportsMicrospace
private void Window_Loaded(object sender, RoutedEventArgs e) 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(); LoadRTSP();
} }
@ -74,13 +87,11 @@ namespace Wpf_AiSportsMicrospace
//_sport.Start(); //_sport.Start();
//_detectQueue.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.OnExtractFrame += this.OnFrameExtracted;
_webcamClient.StartExtract();//开始抽帧 _webcamClient.StartExtract();//开始抽帧
} }
private DateTime _lastSlideTime = DateTime.MinValue; private DateTime _lastSlideTime = DateTime.MinValue;
@ -96,31 +107,42 @@ namespace Wpf_AiSportsMicrospace
{ {
var buffer = frame.GetImageBuffer(ImageFormat.Jpeg).ToArray(); var buffer = frame.GetImageBuffer(ImageFormat.Jpeg).ToArray();
var humanResult = _humanPredictor.Predicting(buffer, frame.Number); 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 //var human = humans
if ((DateTime.Now - _lastSlideTime).TotalMilliseconds < 300) return; // .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; _lastSlideTime = DateTime.Now;
Application.Current?.Dispatcher?.BeginInvoke(new Action(() => // 根据手势结果选择滑动方向
if (leftResult != 0 && leftElbowResult != 1)
{ {
try SlideCoverFlow(coverFlow.SlideRight);
{ }
if (tr == 0) if (rightResult != 0 & rightElbowResult != 1)
{ {
//coverFlow.SlideLeft(); SlideCoverFlow(coverFlow.SlideLeft);
} }
else if (tr == 1)
coverFlow.SlideRight();
}
catch (Exception ex)
{
Console.WriteLine("UI update error: " + ex.Message);
}
}), System.Windows.Threading.DispatcherPriority.Background);
} }
catch (Exception ex) 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);
}
} }
} }