检测类

This commit is contained in:
tanglong 2025-09-25 15:35:15 +08:00
parent 3f343a5931
commit b5db17278f
4 changed files with 157 additions and 67 deletions

View File

@ -0,0 +1,85 @@
using HandyControl.Controls;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using Yztob.AiSports.Inferences.Abstractions;
using Yztob.AiSports.Inferences.Things;
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.Common
{
/// <summary>
/// 运动检测操作类
/// </summary>
public class SportOperate
{
private DateTime _lastSlideTime = DateTime.MinValue;
public WebcamClient CreateRTSP()
{
WebcamClient webcamClient = WebcamClient.CreateRTSP("192.168.3.64", "admin", "yd708090", 554u);
return webcamClient;
}
/// <summary>
/// 验证挥手动作[0无效12右]
/// </summary>
/// <param name="human"></param>
public int VerifyWavingAction(Human human)
{
IPointTracker _leftTracker = PostureCalculate.CreatePointTracker("left_wrist", 0);
IPointTracker _rightTracker = PostureCalculate.CreatePointTracker("right_wrist", 0);
IPointTracker _leftElbow = PostureCalculate.CreatePointTracker("left_elbow", 0);
IPointTracker _rightElbow = PostureCalculate.CreatePointTracker("right_elbow", 0);
_leftTracker.Amplitude = 0.05f;
_rightTracker.Amplitude = 0.05f;
_leftElbow.Amplitude = 0.05f;
_rightElbow.Amplitude = 0.05f;
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 0;
_lastSlideTime = DateTime.Now;
// 根据手势结果选择滑动方向
if (leftResult != 0 && leftElbowResult != 0) return 1;
if (rightResult != 0 & rightElbowResult != 0) return 2;
return 0;
}
public int VerifyLiftHandAction(Human human)
{
IPointTracker _rightTracker = PostureCalculate.CreatePointTracker("right_wrist", 0);
IPointTracker _rightElbow = PostureCalculate.CreatePointTracker("right_elbow", 0);
_rightTracker.Amplitude = 0.05f;
_rightElbow.Amplitude = 0.05f;
var rightResult = _rightTracker.Tracking(human);
var rightElbowResult = _rightElbow.Tracking(human);
// 节流:每 300ms 最多更新一次 UI
if ((DateTime.Now - _lastSlideTime).TotalMilliseconds < 500) return 0;
_lastSlideTime = DateTime.Now;
// 根据手势结果选择滑动方向
if (rightResult != 0 & rightElbowResult != 0) return 1;
return 0;
}
}
}

View File

@ -1,4 +1,5 @@
using Microsoft.ML.Runtime;

using Microsoft.ML.Runtime;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
@ -34,11 +35,10 @@ namespace Wpf_AiSportsMicrospace
private readonly List<SportDescriptor> _sports;
private SportBase _sport;
private readonly SportDetectionQueue _detectQueue;
private IPointTracker _leftTracker;
private IPointTracker _rightTracker;
private IPointTracker _leftElbow;
private IPointTracker _rightElbow;
private WebcamClient _webcamClient;
private DateTime _lastSlideTime = DateTime.MinValue;
private SportOperate _sportOperate;
public Home()
{
@ -74,35 +74,15 @@ namespace Wpf_AiSportsMicrospace
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//_leftTracker = PostureCalculate.CreatePointTracker("left_wrist", 0);
//_rightTracker = PostureCalculate.CreatePointTracker("right_wrist", 0);
//_leftElbow = PostureCalculate.CreatePointTracker("left_elbow", 0);
//_rightElbow = PostureCalculate.CreatePointTracker("right_elbow", 0);
_sportOperate = new SportOperate();
//_leftTracker.Amplitude = 0.05f;
//_rightTracker.Amplitude = 0.05f;
//_leftElbow.Amplitude = 0.05f;
//_rightElbow.Amplitude = 0.05f;
//LoadRTSP();
}
private void LoadRTSP()
{
//_sport.Reset();
//_sport.Start();
//_detectQueue.Start();
_webcamClient = WebcamClient.CreateRTSP("192.168.3.64", "admin", "yd708090", 554u);
_webcamClient = _sportOperate.CreateRTSP();
//处理抽帧回调
_webcamClient.OnExtractFrame += this.OnFrameExtracted;
_webcamClient.StartExtract();//开始抽帧
}
private DateTime _lastSlideTime = DateTime.MinValue;
private void OnFrameExtracted(VideoFrame frame)
{
if (frame == null) return;
@ -119,37 +99,38 @@ namespace Wpf_AiSportsMicrospace
if (humans == null || humans.Count == 0)
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
.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();
//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;
if (human == null) return;
//检测挥手动作
var wavingAction = _sportOperate.VerifyWavingAction(human);
// 根据手势结果选择滑动方向
if (leftResult != 0 && leftElbowResult != 1)
if (wavingAction == 1)
{
SlideCoverFlow(coverFlow.SlideRight);
}
if (rightResult != 0 & rightElbowResult != 1)
if (wavingAction == 2)
{
SlideCoverFlow(coverFlow.SlideLeft);
}
//检测举手动作
var liftHandAction = _sportOperate.VerifyLiftHandAction(human);
// 根据手势结果选择滑动方向
if (wavingAction == 1)
{
// 启动进度条动画;
SlideCoverFlow(coverFlow.StartSelectedProgress);
}
}
catch (Exception ex)
{
@ -173,5 +154,11 @@ namespace Wpf_AiSportsMicrospace
}
}), System.Windows.Threading.DispatcherPriority.Background);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
// 启动进度条动画;
SlideCoverFlow(coverFlow.StartSelectedProgress);
}
}
}

View File

@ -34,12 +34,19 @@
<Image Source="{Binding ImageUri}" Width="150" Height="200" Stretch="UniformToFill"/>
<!-- 矩形进度条 -->
<Path Stroke="Gold" StrokeThickness="4"
<Path Stroke="Yellow" StrokeThickness="4"
Data="{Binding Progress, Converter={StaticResource ProgressToRectangleGeometryConverter}, ConverterParameter='150,200'}"/>
<!-- 火花 -->
<Ellipse x:Name="Spark" Width="8" Height="8" Fill="Yellow" Visibility="Collapsed">
<Ellipse x:Name="Spark" Width="8" Height="8" Visibility="Collapsed">
<Ellipse.Fill>
<RadialGradientBrush GradientOrigin="0.5,0.5" Center="0.5,0.5" RadiusX="1" RadiusY="1">
<GradientStop Color="Yellow" Offset="0"/>
<GradientStop Color="Orange" Offset="0.4"/>
<GradientStop Color="Red" Offset="1"/>
</RadialGradientBrush>
</Ellipse.Fill>
<Ellipse.Effect>
<DropShadowEffect Color="White" BlurRadius="10" ShadowDepth="0"/>
<DropShadowEffect Color="Orange" BlurRadius="10" ShadowDepth="0"/>
</Ellipse.Effect>
</Ellipse>
</Canvas>

View File

@ -46,8 +46,8 @@ namespace Wpf_AiSportsMicrospace.MyUserControl
UpdateLayoutWithAnimation();
// 启动进度条动画
var current = Images[_selectedIndex];
StartProgress(current);
//var current = Images[_selectedIndex];
//StartProgress(current);
}
}
@ -72,7 +72,19 @@ namespace Wpf_AiSportsMicrospace.MyUserControl
private CoverFlowItem _currentItem;
private void StartProgress(CoverFlowItem item)
/// <summary>
/// 针对当前选中项启动进度条动画
/// </summary>
public void StartSelectedProgress()
{
if (SelectedIndex >= 0 && SelectedIndex < Images.Count)
{
var current = Images[SelectedIndex];
StartProgress(current);
}
}
public void StartProgress(CoverFlowItem item)
{
StopProgress();
@ -91,7 +103,7 @@ namespace Wpf_AiSportsMicrospace.MyUserControl
{
if (_currentItem.Progress < 1)
{
_currentItem.Progress += 0.002; // 控制速度
_currentItem.Progress += 0.00556; // 控制速度
if (spark != null)
{
var pos = GetSparkPosition(_currentItem.Progress, 150, 200);
@ -164,7 +176,6 @@ namespace Wpf_AiSportsMicrospace.MyUserControl
private void UpdateLayoutWithAnimation(bool instant = false)
{
double centerX = ActualWidth / 2;
double spacing = 180;
double sideScale = 0.8;
@ -229,18 +240,18 @@ namespace Wpf_AiSportsMicrospace.MyUserControl
new DoubleAnimation(targetOpacity, TimeSpan.FromMilliseconds(400)));
}
var item = Images[i];
//var item = Images[i];
if (i == SelectedIndex)
{
item.IsSelected = true;
StartProgress(item); // 开始绘制进度条 + 火花
}
else
{
item.IsSelected = false;
StopProgress(); // 停止并重置进度
}
//if (i == SelectedIndex)
//{
// item.IsSelected = true;
// StartProgress(item); // 开始绘制进度条 + 火花
//}
//else
//{
// item.IsSelected = false;
// StopProgress(); // 停止并重置进度
//}
}
}