左右滑

This commit is contained in:
tanglong 2025-09-23 16:04:47 +08:00
parent 47e10d2323
commit e492e408ee
3 changed files with 106 additions and 2 deletions

View File

@ -2,7 +2,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Wpf_AiSportsMicrospace.MyUserControl" xmlns:local="clr-namespace:Wpf_AiSportsMicrospace.MyUserControl"
Title="Home" Height="400" Width="800"> Title="Home" Height="400" Width="800" Loaded="Window_Loaded">
<Grid> <Grid>
<local:CoverFlowControl x:Name="coverFlow" HorizontalAlignment="Center" VerticalAlignment="Center"/> <local:CoverFlowControl x:Name="coverFlow" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid> </Grid>

View File

@ -1,4 +1,5 @@
using System; using Microsoft.ML.Runtime;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.ComponentModel; using System.ComponentModel;
@ -10,7 +11,15 @@ using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Animation; using System.Windows.Media.Animation;
using Wpf_AiSportsMicrospace.Common;
using Wpf_AiSportsMicrospace.MyUserControl; using Wpf_AiSportsMicrospace.MyUserControl;
using Yztob.AiSports.Inferences.Abstractions;
using Yztob.AiSports.Postures;
using Yztob.AiSports.Postures.Abstractions;
using Yztob.AiSports.Postures.Sports;
using Yztob.AiSports.Postures.Things;
using Yztob.AiSports.Sensors.Abstractions;
using Yztob.AiSports.Sensors.Things;
namespace Wpf_AiSportsMicrospace namespace Wpf_AiSportsMicrospace
{ {
@ -19,9 +28,24 @@ namespace Wpf_AiSportsMicrospace
/// </summary> /// </summary>
public partial class Home : Window public partial class Home : Window
{ {
private IHumanPredictor _humanPredictor;
private IObjectDetector _objectDetector;
private HumanGraphicsRenderer _humanGraphicsRenderer;
private readonly List<SportDescriptor> _sports;
private SportBase _sport;
private readonly SportDetectionQueue _detectQueue;
private IPointTracker _tracker;
public Home() public Home()
{ {
InitializeComponent(); InitializeComponent();
_humanPredictor = HumanPredictorFactory.Create(HumanPredictorType.SingleHigh);
_objectDetector = ObjectDetectorFactory.CreateSportGoodsDetector();
_humanGraphicsRenderer = new HumanGraphicsRenderer();
_humanGraphicsRenderer.DrawLabel = false;
_sports = SportBase.GetSports();
_detectQueue = new SportDetectionQueue();
string projectRoot = Path.Combine(AppContext.BaseDirectory, @"..\..\.."); string projectRoot = Path.Combine(AppContext.BaseDirectory, @"..\..\..");
string albumPath = Path.Combine(projectRoot, "Resources", "Img", "Album"); string albumPath = Path.Combine(projectRoot, "Resources", "Img", "Album");
@ -36,5 +60,73 @@ namespace Wpf_AiSportsMicrospace
// 默认选中第3张 // 默认选中第3张
coverFlow.SelectedIndex = 2; coverFlow.SelectedIndex = 2;
} }
private void Window_Loaded(object sender, RoutedEventArgs e)
{
_tracker = PostureCalculate.CreatePointTracker("left_wrist", 0);
LoadRTSP();
}
private void LoadRTSP()
{
//_sport.Reset();
//_sport.Start();
//_detectQueue.Start();
var _webcamClient = WebcamClient.CreateRTSP("192.168.3.64", "admin", "yd708090", 554u);
//处理抽帧回调
_webcamClient.OnExtractFrame += this.OnFrameExtracted;
_webcamClient.StartExtract();//开始抽帧
}
private DateTime _lastSlideTime = DateTime.MinValue;
private void OnFrameExtracted(VideoFrame frame)
{
if (frame == null) return;
// 抽帧和人体识别全部在后台线程
Task.Run(() =>
{
try
{
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 右滑
// 节流:每 500ms 最多更新一次 UI
if ((DateTime.Now - _lastSlideTime).TotalMilliseconds < 300) return;
_lastSlideTime = DateTime.Now;
Application.Current?.Dispatcher?.BeginInvoke(new Action(() =>
{
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);
}
catch (Exception ex)
{
Console.WriteLine("OnFrameExtracted error: " + ex.Message);
}
});
}
} }
} }

View File

@ -147,5 +147,17 @@ namespace Wpf_AiSportsMicrospace.MyUserControl
} }
return null; return null;
} }
// 外部调用:左滑(下一张)
public void SlideLeft()
{
SelectedIndex++;
}
// 外部调用:右滑(上一张)
public void SlideRight()
{
SelectedIndex--;
}
} }
} }