Commit f55bde89 by liulongfei

1. GPIO 封装

2. 居中模式移动添加配置,时间限制改为帧限制
3. 添加边线监测新字段 field_border
parent d5d0a336
File added
File added
...@@ -48,6 +48,7 @@ namespace VIZ.H2V.Connection ...@@ -48,6 +48,7 @@ namespace VIZ.H2V.Connection
message.target_bbox = new RawRectangleF(package.target_bbox[0], package.target_bbox[1], package.target_bbox[2], package.target_bbox[3]); message.target_bbox = new RawRectangleF(package.target_bbox[0], package.target_bbox[1], package.target_bbox[2], package.target_bbox[3]);
} }
message.borderline = package.borderline; message.borderline = package.borderline;
message.field_border = package.field_border;
message.correction_area = package.correction_area; message.correction_area = package.correction_area;
ApplicationDomainEx.MessageManager.Send(message); ApplicationDomainEx.MessageManager.Send(message);
......
...@@ -39,6 +39,12 @@ namespace VIZ.H2V.Connection ...@@ -39,6 +39,12 @@ namespace VIZ.H2V.Connection
public AlgorithmInfo_borderline borderline { get; set; } public AlgorithmInfo_borderline borderline { get; set; }
/// <summary> /// <summary>
/// 边线信息(新的边线检测结果)
/// 例如: [[100,200],[300,400]] 表示 两个点 (100,200) 、(300,400)
/// </summary>
public List<List<int>> field_border { get; set; }
/// <summary>
/// 时间码 /// 时间码
/// </summary> /// </summary>
public long timecode { get; set; } public long timecode { get; set; }
......
...@@ -29,6 +29,12 @@ namespace VIZ.H2V.Domain ...@@ -29,6 +29,12 @@ namespace VIZ.H2V.Domain
public AlgorithmInfo_borderline borderline { get; set; } public AlgorithmInfo_borderline borderline { get; set; }
/// <summary> /// <summary>
/// 边线信息(新的边线检测结果)
/// 例如: [[100,200],[300,400]] 表示 两个点 (100,200) 、(300,400)
/// </summary>
public List<List<int>> field_border { get; set; }
/// <summary>
/// 手动校准区域 /// 手动校准区域
/// </summary> /// </summary>
public List<int> correction_area { get; set; } public List<int> correction_area { get; set; }
......
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VIZ.H2V.Module
{
/// <summary>
/// GPIO控制器
/// </summary>
public class GpioController
{
/// <summary>
/// 日志
/// </summary>
private readonly static ILog log = LogManager.GetLogger(typeof(GpioController));
/// <summary>
/// GPIO控制器
/// </summary>
/// <param name="support"></param>
public GpioController(IGpioSupport support)
{
this.Support = support;
}
/// <summary>
/// 支持
/// </summary>
public IGpioSupport Support { get; private set; }
/// <summary>
/// 初始化
/// </summary>
public void Init()
{
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VIZ.H2V.Module
{
/// <summary>
/// GPIO支持
/// </summary>
public interface IGpioSupport
{
}
}
...@@ -138,8 +138,8 @@ namespace VIZ.H2V.Module ...@@ -138,8 +138,8 @@ namespace VIZ.H2V.Module
if (manager == null) if (manager == null)
return; return;
// 在2秒内移动裁切框至居中模式值 // 移动裁切框至居中模式值
this.Support.MoveClipBoxToCenterMode(1); this.Support.MoveClipBoxToCenterMode();
// 更新裁切框样式 // 更新裁切框样式
this.Support.UpdateClipBoxToAutoOrCenterStyle(); this.Support.UpdateClipBoxToAutoOrCenterStyle();
......
...@@ -84,14 +84,12 @@ namespace VIZ.H2V.Module ...@@ -84,14 +84,12 @@ namespace VIZ.H2V.Module
/// 移动裁切框至X /// 移动裁切框至X
/// </summary> /// </summary>
/// <param name="targetX">目标X</param> /// <param name="targetX">目标X</param>
/// <param name="seconds">等待时间</param> void MoveClipBoxTo(double targetX);
void MoveClipBoxTo(double targetX, double seconds);
/// <summary> /// <summary>
/// 移动裁切框至居中模式的值 /// 移动裁切框至居中模式的值
/// </summary> /// </summary>
/// <param name="seconds">等待时间</param> void MoveClipBoxToCenterMode();
void MoveClipBoxToCenterMode(double seconds);
/// <summary> /// <summary>
/// 重置3D鼠标 /// 重置3D鼠标
......
...@@ -33,8 +33,7 @@ namespace VIZ.H2V.Module ...@@ -33,8 +33,7 @@ namespace VIZ.H2V.Module
/// <param name="min">最小值</param> /// <param name="min">最小值</param>
/// <param name="max">最大值</param> /// <param name="max">最大值</param>
/// <param name="targetX">目标值</param> /// <param name="targetX">目标值</param>
/// <param name="seconds">等待时间</param> void MoveTo(double min, double max, double targetX);
void MoveTo(double min, double max, double targetX, double seconds);
/// <summary> /// <summary>
/// 获取映射值 /// 获取映射值
......
...@@ -9,6 +9,7 @@ using VIZ.Framework.Core; ...@@ -9,6 +9,7 @@ using VIZ.Framework.Core;
using VIZ.H2V.Domain; using VIZ.H2V.Domain;
using log4net; using log4net;
using VIZ.H2V.Storage; using VIZ.H2V.Storage;
using VIZ.Framework.Storage;
namespace VIZ.H2V.Module namespace VIZ.H2V.Module
{ {
...@@ -52,14 +53,24 @@ namespace VIZ.H2V.Module ...@@ -52,14 +53,24 @@ namespace VIZ.H2V.Module
public IManualSupport Support { get; private set; } public IManualSupport Support { get; private set; }
/// <summary> /// <summary>
/// 裁切框自动移动帧数
/// </summary>
private int ClipBoxAutoMovingFrame;
/// <summary>
/// 裁切框是否正在自动移动中 /// 裁切框是否正在自动移动中
/// </summary> /// </summary>
private bool IsClipBoxAutoMoving; private bool IsClipBoxAutoMoving;
/// <summary> /// <summary>
/// 裁切框每帧自动移动距离(单位 :像素 /// 剪切框自动移动速度(单位:像素/帧
/// </summary> /// </summary>
private int CLIP_BOX_AUTO_MOVING = 80; private static readonly int VIDEO_CLIP_BOX_AUTO_MOVE_SPEED = ApplicationDomainEx.IniStorage.GetValue<VideoConfig, int>(p => p.VIDEO_CLIP_BOX_AUTO_MOVE_SPEED);
/// <summary>
/// 剪切框自动移动持续帧数(单位:帧数)
/// </summary>
private static readonly int VIDEO_CLIP_BOX_AUTO_MOVE_DURATION_FRAME = ApplicationDomainEx.IniStorage.GetValue<VideoConfig, int>(p => p.VIDEO_CLIP_BOX_AUTO_MOVE_DURATION_FRAME);
/// <summary> /// <summary>
/// 移动至 /// 移动至
...@@ -67,22 +78,13 @@ namespace VIZ.H2V.Module ...@@ -67,22 +78,13 @@ namespace VIZ.H2V.Module
/// <param name="min">最小值</param> /// <param name="min">最小值</param>
/// <param name="max">最大值</param> /// <param name="max">最大值</param>
/// <param name="targetX">目标值</param> /// <param name="targetX">目标值</param>
/// <param name="seconds">等待时间</param> public void MoveTo(double min, double max, double targetX)
public void MoveTo(double min, double max, double targetX, double seconds)
{ {
this.Support.IsCenterModeMoveToCenterEnabled = false;
this.Reset(this.Support.ClipBoxX); this.Reset(this.Support.ClipBoxX);
this.ClipBoxCenterX = MathHelper.Clip(min, max, targetX); this.ClipBoxCenterX = MathHelper.Clip(min, max, targetX);
this.ClipBoxAutoMovingFrame = 0;
this.IsClipBoxAutoMoving = true; this.IsClipBoxAutoMoving = true;
this.Support.IsCenterModeMoveToCenterEnabled = false;
ApplicationDomainEx.DelayManager.Wait("ManualController.MoveTo", seconds, () =>
{
// 重置手动裁切
this.Reset(this.Support.ClipBoxX);
// 设置裁切框不是自动移动状态
this.IsClipBoxAutoMoving = false;
this.Support.IsCenterModeMoveToCenterEnabled = true;
});
} }
/// <summary> /// <summary>
...@@ -93,6 +95,21 @@ namespace VIZ.H2V.Module ...@@ -93,6 +95,21 @@ namespace VIZ.H2V.Module
/// <returns>计算值</returns> /// <returns>计算值</returns>
public double GetCalculationValue(double min, double max) public double GetCalculationValue(double min, double max)
{ {
if (this.IsClipBoxAutoMoving)
{
if (this.ClipBoxAutoMovingFrame == VIDEO_CLIP_BOX_AUTO_MOVE_DURATION_FRAME)
{
this.IsClipBoxAutoMoving = false;
this.ClipBoxAutoMovingFrame = 0;
// 重置手动裁切
this.Reset(this.Support.ClipBoxX);
this.Support.IsCenterModeMoveToCenterEnabled = true;
}
++this.ClipBoxAutoMovingFrame;
}
if (this.Support.StrategyMode == AlgorithmStrategyMode.center_mode) if (this.Support.StrategyMode == AlgorithmStrategyMode.center_mode)
{ {
// 居中模式自动移动过程 // 居中模式自动移动过程
...@@ -179,12 +196,12 @@ namespace VIZ.H2V.Module ...@@ -179,12 +196,12 @@ namespace VIZ.H2V.Module
if (x < this.ClipBoxCenterX) if (x < this.ClipBoxCenterX)
{ {
x += this.CLIP_BOX_AUTO_MOVING; x += VIDEO_CLIP_BOX_AUTO_MOVE_SPEED;
x = x > this.ClipBoxCenterX ? this.ClipBoxCenterX : x; x = x > this.ClipBoxCenterX ? this.ClipBoxCenterX : x;
} }
else if (x > this.ClipBoxCenterX) else if (x > this.ClipBoxCenterX)
{ {
x -= this.CLIP_BOX_AUTO_MOVING; x -= VIDEO_CLIP_BOX_AUTO_MOVE_SPEED;
x = x < this.ClipBoxCenterX ? this.ClipBoxCenterX : x; x = x < this.ClipBoxCenterX ? this.ClipBoxCenterX : x;
} }
......
...@@ -200,7 +200,7 @@ ...@@ -200,7 +200,7 @@
</RadioButton>--> </RadioButton>-->
<!-- 近景机位 & 16米机位 & 战术机位 ===== 边线检测选择面板 --> <!-- 近景机位 & 16米机位 & 战术机位 ===== 边线检测选择面板 -->
<Border Grid.Row="1" Background="{x:Null}" <!--<Border Grid.Row="1" Background="{x:Null}"
Visibility="{Binding Path=AlgorithmConfig.IsShowBorder,Mode=OneWay,Converter={StaticResource Bool2VisibilityConverter}}"> Visibility="{Binding Path=AlgorithmConfig.IsShowBorder,Mode=OneWay,Converter={StaticResource Bool2VisibilityConverter}}">
<RadioButton Style="{StaticResource RadioButton_NdiView_None}" <RadioButton Style="{StaticResource RadioButton_NdiView_None}"
Height="{Binding ElementName=uc,Path=DataContext.StrategyType,Converter={StaticResource AlgorithmStrategyType2FootballFieldHeightConverter}}" Height="{Binding ElementName=uc,Path=DataContext.StrategyType,Converter={StaticResource AlgorithmStrategyType2FootballFieldHeightConverter}}"
...@@ -219,7 +219,7 @@ ...@@ -219,7 +219,7 @@
Orientation="{Binding ElementName=uc,Path=DataContext.StrategyType,Converter={StaticResource AlgorithmStrategyType2FootballFieldOrientationConverter}}"> Orientation="{Binding ElementName=uc,Path=DataContext.StrategyType,Converter={StaticResource AlgorithmStrategyType2FootballFieldOrientationConverter}}">
</common:FootballFieldPanel> </common:FootballFieldPanel>
</RadioButton> </RadioButton>
</Border> </Border>-->
<!-- 居中模式 按钮组--> <!-- 居中模式 按钮组-->
<Grid Grid.Row="1" Background="{x:Null}"> <Grid Grid.Row="1" Background="{x:Null}">
......
...@@ -128,7 +128,10 @@ namespace VIZ.H2V.Module ...@@ -128,7 +128,10 @@ namespace VIZ.H2V.Module
// 边线检测插件 // 边线检测插件
SideCheckPolygonPlugin sideCheckPolygonPlugin = new SideCheckPolygonPlugin(view.video); SideCheckPolygonPlugin sideCheckPolygonPlugin = new SideCheckPolygonPlugin(view.video);
sideCheckPolygonPlugin.Click += SideCheckPolygonPlugin_Click; // -----------------------------------------------------------------------------------------
// 新的边线检测算法不需要校准
//sideCheckPolygonPlugin.Click += SideCheckPolygonPlugin_Click;
// -----------------------------------------------------------------------------------------
view.video.AttachPlugin(sideCheckPolygonPlugin); view.video.AttachPlugin(sideCheckPolygonPlugin);
// 手动校准插件 // 手动校准插件
...@@ -451,7 +454,7 @@ namespace VIZ.H2V.Module ...@@ -451,7 +454,7 @@ namespace VIZ.H2V.Module
/// </summary> /// </summary>
private void CenterModeMoveToCenter() private void CenterModeMoveToCenter()
{ {
this.MoveClipBoxTo(555, 1); this.MoveClipBoxTo(555);
} }
#endregion #endregion
......
...@@ -155,8 +155,13 @@ namespace VIZ.H2V.Module ...@@ -155,8 +155,13 @@ namespace VIZ.H2V.Module
// 更新跟踪框 // 更新跟踪框
this.OnAlgorithmMessage__crop_roi__target_bbox(msg, renderInfo, view); this.OnAlgorithmMessage__crop_roi__target_bbox(msg, renderInfo, view);
// --------------------------------------------------------------------------------------
// 更新边线检测框 // 更新边线检测框
this.OnAlgorithmMessage__crop_roi__borderline(msg, renderInfo, view); //this.OnAlgorithmMessage__crop_roi__borderline(msg, renderInfo, view);
// --------------------------------------------------------------------------------------
// 更新边线检测框(新算法)
this.OnAlgorithmMessage__crop_roi__field_border(msg, renderInfo, view);
// 更新手动校准区域 // 更新手动校准区域
this.OnAlgorithmMessage__crop_roi__correction_area(msg, renderInfo, view); this.OnAlgorithmMessage__crop_roi__correction_area(msg, renderInfo, view);
...@@ -286,6 +291,31 @@ namespace VIZ.H2V.Module ...@@ -286,6 +291,31 @@ namespace VIZ.H2V.Module
} }
/// <summary> /// <summary>
/// 裁切信息更新 -- 更新边线检测框(新算法)
/// </summary>
/// <param name="msg">裁切消息</param>
/// <param name="renderInfo">渲染信息</param>
/// <param name="view">视图</param>
private void OnAlgorithmMessage__crop_roi__field_border(AlgorithmMessage__crop_roi msg, VideoRenderInfo renderInfo, NDIView view)
{
if (msg.field_border == null || !this.AlgorithmConfig.IsShowBorder)
{
view.video.ClearSideCheckPolygon();
return;
}
List<SideCheckPolygonInfo> infos = new List<SideCheckPolygonInfo>();
if (msg.field_border.Count > 2)
{
infos.Add(this.BuildSideCheckPolygonInfo(msg.field_border));
}
view.video.UpdateSideCheckPolygon(infos);
}
/// <summary>
/// 裁切信息更新 -- 更新手动校准区域 /// 裁切信息更新 -- 更新手动校准区域
/// </summary> /// </summary>
/// <param name="msg">裁切消息</param> /// <param name="msg">裁切消息</param>
......
...@@ -245,8 +245,7 @@ namespace VIZ.H2V.Module ...@@ -245,8 +245,7 @@ namespace VIZ.H2V.Module
/// 移动裁切框至X /// 移动裁切框至X
/// </summary> /// </summary>
/// <param name="targetX">目标X</param> /// <param name="targetX">目标X</param>
/// <param name="seconds">等待时间</param> public void MoveClipBoxTo(double targetX)
public void MoveClipBoxTo(double targetX, double seconds)
{ {
NDIView view = this.GetView<NDIView>(); NDIView view = this.GetView<NDIView>();
if (view == null) if (view == null)
...@@ -262,16 +261,15 @@ namespace VIZ.H2V.Module ...@@ -262,16 +261,15 @@ namespace VIZ.H2V.Module
return; return;
} }
this.ManualController.MoveTo(0, renderInfo.Frame.Width, targetX, seconds); this.ManualController.MoveTo(0, renderInfo.Frame.Width, targetX);
} }
/// <summary> /// <summary>
/// 移动裁切框至居中模式的值 /// 移动裁切框至居中模式的值
/// </summary> /// </summary>
/// <param name="seconds">等待时间</param> public void MoveClipBoxToCenterMode()
public void MoveClipBoxToCenterMode(double seconds)
{ {
this.MoveClipBoxTo(this.ClipBoxX_CenterMode, seconds); this.MoveClipBoxTo(this.ClipBoxX_CenterMode);
} }
/// <summary> /// <summary>
......
...@@ -203,6 +203,8 @@ ...@@ -203,6 +203,8 @@
</Page> </Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="NDIMainView\Controller\Gpio\GpioController.cs" />
<Compile Include="NDIMainView\Controller\Gpio\IGpioSupport.cs" />
<Compile Include="NDIMainView\ViewModel\AlgorithmServiceStatusPanelViewModel.cs" /> <Compile Include="NDIMainView\ViewModel\AlgorithmServiceStatusPanelViewModel.cs" />
<Compile Include="NDIMainView\ViewModel\ClipServiceStatusPanelViewModel.cs" /> <Compile Include="NDIMainView\ViewModel\ClipServiceStatusPanelViewModel.cs" />
<Compile Include="NDIMainView\View\AlgorithmServiceStatusPanelView.xaml.cs"> <Compile Include="NDIMainView\View\AlgorithmServiceStatusPanelView.xaml.cs">
......
...@@ -6,10 +6,6 @@ ...@@ -6,10 +6,6 @@
APPLICATION_IS_DEBUG=true APPLICATION_IS_DEBUG=true
;3D鼠标平滑系数 ;3D鼠标平滑系数
APPLICATION_3D_MOUSE_SMOOTH_COEFFICIENT=0.015 APPLICATION_3D_MOUSE_SMOOTH_COEFFICIENT=0.015
;3D鼠标TCP监听IP
APPLICATION_3D_MOUSE_TCP_IP=127.0.0.1
;3D鼠标TCP监听端口
APPLICATION_3D_MOUSE_TCP_PORT=8201
; ============================================================ ; ============================================================
; === Video === ; === Video ===
; ============================================================ ; ============================================================
...@@ -46,6 +42,10 @@ VIDEO_CLIP_BOX_CENTER_AXIS_WIDTH=2 ...@@ -46,6 +42,10 @@ VIDEO_CLIP_BOX_CENTER_AXIS_WIDTH=2
VIDEO_CLIP_BOX_CENTER_AXIS_COLOR=#AA000000 VIDEO_CLIP_BOX_CENTER_AXIS_COLOR=#AA000000
;剪切框中心轴颜色透明度 ;剪切框中心轴颜色透明度
VIDEO_CLIP_BOX_CENTER_AXIS_OPACITY=0.4 VIDEO_CLIP_BOX_CENTER_AXIS_OPACITY=0.4
;剪切框自动移动速度(单位:像素/帧)
VIDEO_CLIP_BOX_AUTO_MOVE_SPEED=100
;剪切框自动移动持续帧数(单位:帧数)
VIDEO_CLIP_BOX_AUTO_MOVE_DURATION_FRAME=50
;视频边线检测多边形区域透明度 ;视频边线检测多边形区域透明度
VIDEO_SIDE_CHECK_POLYGON_OPACITY=0.15 VIDEO_SIDE_CHECK_POLYGON_OPACITY=0.15
;视频人工校准区域透明度 ;视频人工校准区域透明度
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment