This commit is contained in:
tanglong 2025-11-17 10:02:42 +08:00
parent 1963f5d194
commit c2729dfac0
12 changed files with 204 additions and 5167 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@ -52,7 +52,7 @@
单人检测-高精度3D结构 单人检测-高精度3D结构
</summary> </summary>
</member> </member>
<member name="F:Yztob.AiSports.Inferences.Abstractions.HumanPredictorType.MultiFast"> <member name="F:Yztob.AiSports.Inferences.Abstractions.HumanPredictorType.MultiLow">
<summary> <summary>
多人检测-低精度低速率2D结构 多人检测-低精度低速率2D结构
</summary> </summary>

Binary file not shown.

View File

@ -6,7 +6,7 @@
<members> <members>
<member name="T:Yztob.AiSports.Postures.Abstractions.ICalculator"> <member name="T:Yztob.AiSports.Postures.Abstractions.ICalculator">
<summary> <summary>
人体姿态计算检测执行器 人体姿态检测规则执行计算
</summary> </summary>
</member> </member>
<member name="P:Yztob.AiSports.Postures.Abstractions.ICalculator.PointThreshold"> <member name="P:Yztob.AiSports.Postures.Abstractions.ICalculator.PointThreshold">
@ -727,6 +727,17 @@
一些扩展方法 一些扩展方法
</summary> </summary>
</member> </member>
<member name="M:Yztob.AiSports.Postures.Extensions.GravityLine(Yztob.AiSports.Inferences.Things.Human)">
<summary>
获取当前<seealso cref="T:Yztob.AiSports.Inferences.Things.Human"/>的人体重力线
</summary>
<param name="human">要计算的人体</param>
<returns>
返回重力线的上、下起点
[0]-为线的上端点
[1]-为线的下端点
</returns>
</member>
<member name="M:Yztob.AiSports.Postures.Extensions.AsPointF(Yztob.AiSports.Inferences.Things.Keypoint)"> <member name="M:Yztob.AiSports.Postures.Extensions.AsPointF(Yztob.AiSports.Inferences.Things.Keypoint)">
<summary> <summary>
<paramref name="keypoint"/>坐标值转换成<seealso cref="T:System.Drawing.PointF"/> <paramref name="keypoint"/>坐标值转换成<seealso cref="T:System.Drawing.PointF"/>
@ -734,6 +745,13 @@
<param name="keypoint">要转换的关键点</param> <param name="keypoint">要转换的关键点</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Yztob.AiSports.Postures.Extensions.ToCenterPoint(System.Collections.Generic.IEnumerable{Yztob.AiSports.Inferences.Things.Keypoint})">
<summary>
获取当前关键点集中的中心点位置
</summary>
<param name="keypoints">关键点集</param>
<returns></returns>
</member>
<member name="T:Yztob.AiSports.Postures.Implement.Calculator"> <member name="T:Yztob.AiSports.Postures.Implement.Calculator">
<summary> <summary>
人体姿态计算检测执行器 人体姿态计算检测执行器
@ -1326,6 +1344,70 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:Yztob.AiSports.Postures.PostureUtility">
<summary>
姿态分析相关工具函数集
</summary>
</member>
<member name="M:Yztob.AiSports.Postures.PostureUtility.GetBodyKeyNameMaps">
<summary>
获取身体关键点键-名映射字典
</summary>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Postures.PostureUtility.GetCameraViewName(Yztob.AiSports.Postures.Things.CameraViews)">
<summary>
获取相机视角名称
</summary>
<param name="view">当前视角</param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Postures.PostureUtility.Angle(System.Nullable{System.Drawing.PointF},System.Nullable{System.Drawing.PointF},System.Nullable{System.Drawing.PointF})">
<summary>
计算平面三个点的角度
</summary>
<param name="center">角度点</param>
<param name="second">上角点</param>
<param name="third">下角点</param>
<returns>
-1至少一个有一个坐标点是空的否则返回计算角度
</returns>
</member>
<member name="M:Yztob.AiSports.Postures.PostureUtility.Angle(Yztob.AiSports.Inferences.Things.Keypoint,Yztob.AiSports.Inferences.Things.Keypoint,Yztob.AiSports.Inferences.Things.Keypoint)">
<summary>
计算三个人体关键点角度
</summary>
<param name="center">角度人体关键点</param>
<param name="second">上角人体关键点</param>
<param name="third">下角人体关键点</param>
<returns>
计算后的角度
</returns>
</member>
<member name="M:Yztob.AiSports.Postures.PostureUtility.AssertAngle(System.Single,System.Single,System.Single)">
<summary>
断言<paramref name="angle"/>是否有<paramref name="expect"/>匹配
</summary>
<param name="angle">实际测量的角度</param>
<param name="expect">期望的角度</param>
<param name="offset">允许的偏差</param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Postures.PostureUtility.IoU(Yztob.AiSports.Inferences.Things.BoundingBox,Yztob.AiSports.Inferences.Things.BoundingBox)">
<summary>
计算两个边界框的交并比
</summary>
<param name="box1">框1</param>
<param name="box2">框2</param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Postures.PostureUtility.CenterPoint(System.Collections.Generic.IEnumerable{Yztob.AiSports.Inferences.Things.Keypoint})">
<summary>
计算多个关键点之间的中心点位置
</summary>
<param name="keypoints">关键点集</param>
<returns></returns>
</member>
<member name="T:Yztob.AiSports.Postures.Sports.CounterTicked"> <member name="T:Yztob.AiSports.Postures.Sports.CounterTicked">
<summary> <summary>
运动计数器计数变化委托 运动计数器计数变化委托
@ -1752,6 +1834,9 @@
获取或设置垫子长度单位cm 获取或设置垫子长度单位cm
</summary> </summary>
</member> </member>
<member name="M:Yztob.AiSports.Postures.Sports.SportStandingLongJump.Pushing(Yztob.AiSports.Inferences.Things.Human)">
<inheritdoc />
</member>
<member name="M:Yztob.AiSports.Postures.Sports.SportStandingLongJump.Pushing(Yztob.AiSports.Inferences.Things.Human,System.Collections.Generic.IEnumerable{Yztob.AiSports.Inferences.Things.BoundingBox})"> <member name="M:Yztob.AiSports.Postures.Sports.SportStandingLongJump.Pushing(Yztob.AiSports.Inferences.Things.Human,System.Collections.Generic.IEnumerable{Yztob.AiSports.Inferences.Things.BoundingBox})">
<inheritdoc /> <inheritdoc />
</member> </member>
@ -2335,63 +2420,6 @@
<param name="trend">当前势</param> <param name="trend">当前势</param>
<param name="isChanged">趋势是否变化</param> <param name="isChanged">趋势是否变化</param>
</member> </member>
<member name="T:Yztob.AiSports.Postures.Utility">
<summary>
姿态分析相关工具函数集
</summary>
</member>
<member name="M:Yztob.AiSports.Postures.Utility.GetBodyKeyNameMaps">
<summary>
获取身体关键点键-名映射字典
</summary>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Postures.Utility.GetCameraViewName(Yztob.AiSports.Postures.Things.CameraViews)">
<summary>
获取相机视角名称
</summary>
<param name="view">当前视角</param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Postures.Utility.Angle(System.Nullable{System.Drawing.PointF},System.Nullable{System.Drawing.PointF},System.Nullable{System.Drawing.PointF})">
<summary>
计算平面三个点的角度
</summary>
<param name="center">角度点</param>
<param name="second">上角点</param>
<param name="third">下角点</param>
<returns>
-1至少一个有一个坐标点是空的否则返回计算角度
</returns>
</member>
<member name="M:Yztob.AiSports.Postures.Utility.Angle(Yztob.AiSports.Inferences.Things.Keypoint,Yztob.AiSports.Inferences.Things.Keypoint,Yztob.AiSports.Inferences.Things.Keypoint)">
<summary>
计算三个人体关键点角度
</summary>
<param name="center">角度人体关键点</param>
<param name="second">上角人体关键点</param>
<param name="third">下角人体关键点</param>
<returns>
计算后的角度
</returns>
</member>
<member name="M:Yztob.AiSports.Postures.Utility.AssertAngle(System.Single,System.Single,System.Single)">
<summary>
断言<paramref name="angle"/>是否有<paramref name="expect"/>匹配
</summary>
<param name="angle">实际测量的角度</param>
<param name="expect">期望的角度</param>
<param name="offset">允许的偏差</param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Postures.Utility.IoU(Yztob.AiSports.Inferences.Things.BoundingBox,Yztob.AiSports.Inferences.Things.BoundingBox)">
<summary>
计算两个边界框的交并比
</summary>
<param name="box1">框1</param>
<param name="box2">框2</param>
<returns></returns>
</member>
<member name="T:Yztob.AiSports.Common.Licenses.FeatureCpuPartMap"> <member name="T:Yztob.AiSports.Common.Licenses.FeatureCpuPartMap">
<summary> <summary>
表示受权机器CPU部件特性图 表示受权机器CPU部件特性图

View File

@ -55,6 +55,11 @@
获取或设置自应用大小,保持同比缩放 获取或设置自应用大小,保持同比缩放
</summary> </summary>
</member> </member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.NumberDisplayed">
<summary>
获取或设置是否展示帧序号、帧率
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.IsPlaying"> <member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.IsPlaying">
<summary> <summary>
获取当前是否正在播放 获取当前是否正在播放
@ -75,9 +80,14 @@
获取当画面缩放后X轴的偏移量即黑边大小 获取当画面缩放后X轴的偏移量即黑边大小
</summary> </summary>
</member> </member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Fps">
<summary>
获取或设置视频流拉取帧率
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.OnExtracted"> <member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.OnExtracted">
<summary> <summary>
获取或设置抽帧响应 获取或设置抽帧响应,处理的是未解析的原始帧
</summary> </summary>
</member> </member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.OnFrameProcessing"> <member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.OnFrameProcessing">
@ -101,6 +111,12 @@
<member name="M:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Dispose"> <member name="M:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Dispose">
<inheritdoc /> <inheritdoc />
</member> </member>
<member name="M:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Pushing(Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer)">
<summary>
直接向预览器推送帧,进行预览回放
</summary>
<param name="frame">帧图像</param>
</member>
<member name="M:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Play"> <member name="M:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Play">
<summary> <summary>
启动抽帧/预览 启动抽帧/预览

Binary file not shown.

View File

@ -218,12 +218,13 @@
视频流解码器 视频流解码器
</summary> </summary>
</member> </member>
<member name="M:Yztob.AiSports.Sensors.Implement.VideoStreamDecoder.#ctor(System.String,FFmpeg.AutoGen.Abstractions.AVHWDeviceType)"> <member name="M:Yztob.AiSports.Sensors.Implement.VideoStreamDecoder.#ctor(System.String,FFmpeg.AutoGen.Abstractions.AVHWDeviceType,System.Int32)">
<summary> <summary>
初始化解码器 初始化解码器
</summary> </summary>
<param name="url">设备访问url</param> <param name="url">设备访问url</param>
<param name="HWDeviceType">硬件设备类型</param> <param name="HWDeviceType">硬件设备类型</param>
<param name="timeout">视频连接超时是间</param>
</member> </member>
<member name="P:Yztob.AiSports.Sensors.Implement.VideoStreamDecoder.CodecName"> <member name="P:Yztob.AiSports.Sensors.Implement.VideoStreamDecoder.CodecName">
<summary> <summary>
@ -307,11 +308,29 @@
获取FFmpeg原始帧 获取FFmpeg原始帧
</summary> </summary>
</member> </member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrame.PresentTimestamp">
<summary>
获取或设置帧相对流开始的展示时间戳,单位:秒
</summary>
<remarks>通俗的理解便是,此帧在视频的第几秒出现的</remarks>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrame.PreserveDuration">
<summary>
获取或设置上一帧距离这帧维持的时长
</summary>
<remarks>即用当帧的<see cref="P:Yztob.AiSports.Sensors.Things.VideoFrame.PresentTimestamp"/>减去上一帧的<see cref="P:Yztob.AiSports.Sensors.Things.VideoFrame.PresentTimestamp"/></remarks>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrame.Timestamp"> <member name="P:Yztob.AiSports.Sensors.Things.VideoFrame.Timestamp">
<summary> <summary>
获取或设置时间戳从UTC:2000-01-01开始的耗秒数 获取或设置帧提取时的系统时间戳从UTC:2000-01-01开始的耗秒数
</summary> </summary>
</member> </member>
<member name="M:Yztob.AiSports.Sensors.Things.VideoFrame.GetTimestamp">
<summary>
获取当前时间戳
</summary>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Sensors.Things.VideoFrame.GetImageBuffer(Yztob.AiSports.Sensors.Things.ImageFormat)"> <member name="M:Yztob.AiSports.Sensors.Things.VideoFrame.GetImageBuffer(Yztob.AiSports.Sensors.Things.ImageFormat)">
<summary> <summary>
将当前帧转换成指定格式图像,并返回图像缓冲区数组 将当前帧转换成指定格式图像,并返回图像缓冲区数组
@ -359,6 +378,18 @@
获取FFmpeg原始帧 获取FFmpeg原始帧
</summary> </summary>
</member> </member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer.PresentTimestamp">
<summary>
获取或设置帧相对流开始的展示时间戳,单位:秒
</summary>
<remarks>通俗的理解便是,此帧在视频的第几秒出现的</remarks>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer.PreserveDuration">
<summary>
获取或设置上一帧距离这帧维持的时长
</summary>
<remarks>即用当帧的<see cref="P:Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer.PresentTimestamp"/>减去上一帧的<see cref="P:Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer.PresentTimestamp"/></remarks>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer.Timestamp"> <member name="P:Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer.Timestamp">
<summary> <summary>
获取或设置时间戳从UTC:2000-01-01开始的耗秒数 获取或设置时间戳从UTC:2000-01-01开始的耗秒数

View File

@ -172,7 +172,7 @@
host.Name = "host"; host.Name = "host";
host.Size = new Size(236, 23); host.Size = new Size(236, 23);
host.TabIndex = 1; host.TabIndex = 1;
host.Text = "192.168.3.64"; host.Text = "172.17.30.64";
// //
// label2 // label2
// //

View File

@ -1,21 +1,20 @@
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.Net;
using System.Linq; using System.Linq;
using System.Net;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
using Yunzhi.Common; using Yunzhi.Common;
using Yunzhi.Logging; using Yunzhi.Logging;
using Yztob.AiSports.Demo.WinForm.Common;
using Yztob.AiSports.Inferences.Abstractions; using Yztob.AiSports.Inferences.Abstractions;
using Yztob.AiSports.Inferences.Implement;
using Yztob.AiSports.Inferences.Things; using Yztob.AiSports.Inferences.Things;
using Yztob.AiSports.Postures.Abstractions; using Yztob.AiSports.Postures.Abstractions;
using Yztob.AiSports.Postures.Sports; using Yztob.AiSports.Postures.Sports;
using Yztob.AiSports.Postures.Things; using Yztob.AiSports.Postures.Things;
using Yztob.AiSports.Sensors.Abstractions; using Yztob.AiSports.Sensors.Abstractions;
using Yztob.AiSports.Sensors.Things; using Yztob.AiSports.Sensors.Things;
using Yztob.AiSports.Demo.WinForm.Common;
/* /*
* *
@ -38,6 +37,7 @@ public partial class FrmMain : Form
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 ApparatusLongJumpDelineation _measureApparatus;
#endregion #endregion
#region #region
@ -74,8 +74,8 @@ public partial class FrmMain : Form
this.sportTimes.Text = _sport.GetFormatTimes();//ts.ToString(@"mm\'ss\"""); this.sportTimes.Text = _sport.GetFormatTimes();//ts.ToString(@"mm\'ss\""");
//触发停止 //触发停止
//if (!this._sport.IsCounting) if (!this._sport.IsCounting)
// this.startOrStop_Click(null, null); this.startOrStop_Click(null, null);
}); });
//VoiceBroadcast.PlayTick(); //VoiceBroadcast.PlayTick();
} }
@ -87,6 +87,12 @@ public partial class FrmMain : Form
if (_sport?.IsCounting == true) if (_sport?.IsCounting == true)
sport.Start(); sport.Start();
_measureApparatus = new ApparatusLongJumpDelineation();
_measureApparatus.MeasureLength = 300;
var _isCalibrated = this.ReactangleCalibrating(1920, 1080);
sport.MeasureApparatus = _measureApparatus;
_sport?.Stop(); _sport?.Stop();
_detectQueue.Stop(); _detectQueue.Stop();
_sport = sport; _sport = sport;
@ -127,8 +133,61 @@ public partial class FrmMain : Form
Debug.WriteLine(ex.ToString()); Debug.WriteLine(ex.ToString());
} }
}); });
} }
private bool ReactangleCalibrating(int frameWidth, int frameHeight)
{
var boxes = new List<BoundingBox>()
{
new BoundingBox(){
ImageWidth = frameWidth,
ImageHeight = frameHeight,
Label = new PredictionLabel(){
Key = "begin"
},
MaskLayer = new MaskLayer(){
Contours = new List<SixLabors.ImageSharp.PointF>(){
new SixLabors.ImageSharp.PointF(1722, 909),
new SixLabors.ImageSharp.PointF(1689, 724),
}
}
},
new BoundingBox(){
ImageWidth = frameWidth,
ImageHeight = frameHeight,
Label = new PredictionLabel{
Key = "end"
},
MaskLayer = new MaskLayer(){
Contours = new List<SixLabors.ImageSharp.PointF>(){
new SixLabors.ImageSharp.PointF(1516, 918),
new SixLabors.ImageSharp.PointF(1498, 730)
}
}
}
};
boxes[1].Label.Key = "take-off";
boxes.Add(new BoundingBox()
{
ImageWidth = frameWidth,
ImageHeight = frameHeight,
Label = new PredictionLabel
{
Key = "end"
},
MaskLayer = new MaskLayer()
{
Contours = new List<SixLabors.ImageSharp.PointF>(){
new SixLabors.ImageSharp.PointF(191, 918),
new SixLabors.ImageSharp.PointF(245, 741)
}
}
});
return _measureApparatus.Calibrating(boxes);
}
#endregion #endregion
#region #region