Commit d24d5195 by liulongfei

1. 添加手动校准功能

parent cfe6e1e6
......@@ -36,7 +36,7 @@
</Style>
<ControlTemplate x:Key="FootballFieldPanel_Horizontal" TargetType="local:FootballFieldPanel">
<Grid>
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="20"></RowDefinition>
<RowDefinition Height="{Binding Path=FootballFieldHeight,RelativeSource={RelativeSource AncestorLevel=1,Mode=FindAncestor,AncestorType=local:FootballFieldPanel}}"></RowDefinition>
......@@ -88,9 +88,8 @@
</Grid>
</ControlTemplate>
<ControlTemplate x:Key="FootballFieldPanel_Vertical" TargetType="local:FootballFieldPanel">
<Grid>
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="20"></RowDefinition>
<RowDefinition Height="{Binding Path=FootballFieldWidth,RelativeSource={RelativeSource AncestorLevel=1,Mode=FindAncestor,AncestorType=local:FootballFieldPanel}}"></RowDefinition>
......
......@@ -45,5 +45,15 @@ namespace VIZ.H2V.Connection
/// 3. 战术机位 Tactics
/// </remarks>
public const string borderline_correction = "borderline_correction";
/// <summary>
/// 手动校准
/// <see cref="VIZ.H2V.Storage.AlgorithmStrategyType"/>
/// </summary>
/// <remarks>
/// 除单人机位外的其他机位支持
/// 1. 单人机位 Single
/// </remarks>
public const string manual_correction = "manual_correction";
}
}
......@@ -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.borderline = package.borderline;
message.correction_area = package.correction_area;
ApplicationDomainEx.MessageManager.Send(message);
}
......
......@@ -23,8 +23,8 @@ namespace VIZ.H2V.Connection
public bool enable_sendto_crop { get; set; }
/// <summary>
/// 边线检测点
/// 手动校准(x,y,r)
/// </summary>
public AlgorithmInfo_borderpoint borderpoint { get; set; }
public List<int> correction_area { get; set; }
}
}
......@@ -29,6 +29,11 @@ namespace VIZ.H2V.Connection
public List<int> target_bbox { get; set; }
/// <summary>
/// 手动校准区域(x,y,半径r)
/// </summary>
public List<int> correction_area { get; set; }
/// <summary>
/// 边线信息
/// </summary>
public AlgorithmInfo_borderline borderline { get; set; }
......
......@@ -40,5 +40,10 @@ namespace VIZ.H2V.Connection
/// 距离所占权重(0~1)
/// </summary>
public double weight_distance { get; set; }
/// <summary>
/// 手动校准
/// </summary>
public List<int> correction_area { get; set; }
}
}
......@@ -49,5 +49,10 @@ namespace VIZ.H2V.Connection
/// 对应 cmd = borderline_correction 时有值
/// </remarks>
public AlgorithmInfo_borderpoint borderpoint { get; set; }
/// <summary>
/// 手动校准
/// </summary>
public List<int> correction_area { get; set; }
}
}
......@@ -49,5 +49,10 @@ namespace VIZ.H2V.Connection
/// 对应 cmd = borderline_correction 时有值
/// </remarks>
public AlgorithmInfo_borderpoint borderpoint { get; set; }
/// <summary>
/// 手动校准
/// </summary>
public List<int> correction_area { get; set; }
}
}
......@@ -49,5 +49,10 @@ namespace VIZ.H2V.Connection
/// 对应 cmd = borderline_correction 时有值
/// </remarks>
public AlgorithmInfo_borderpoint borderpoint { get; set; }
/// <summary>
/// 手动校准
/// </summary>
public List<int> correction_area { get; set; }
}
}
......@@ -29,6 +29,11 @@ namespace VIZ.H2V.Domain
public AlgorithmInfo_borderline borderline { get; set; }
/// <summary>
/// 手动校准区域
/// </summary>
public List<int> correction_area { get; set; }
/// <summary>
/// 时间码
/// </summary>
public long timecode { get; set; }
......
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Data;
using VIZ.H2V.Storage;
namespace VIZ.H2V.Module.Resource
{
/// <summary>
/// 算法类型 -> 足球场 高度 转化器
/// </summary>
public class AlgorithmStrategyType2FootballFieldHeightConverter : IValueConverter
{
/// <summary>
/// 不包含时的高度
/// </summary>
public double NotContainsHeight { get; set; } = 140;
/// <summary>
/// 包含时的高度
/// </summary>
public double ContainsHeight { get; set; } = 190;
#region StrategyTypeListString -- 算法列表字符串
private string strategyTypeListString;
/// <summary>
/// 算法列表字符串
/// </summary>
public string StrategyTypeListString
{
get { return strategyTypeListString; }
set
{
strategyTypeListString = value;
string[] items = value.Split(',');
List<AlgorithmStrategyType> list = new List<AlgorithmStrategyType>();
foreach (string item in items)
{
list.Add((AlgorithmStrategyType)Enum.Parse(typeof(AlgorithmStrategyType), item.Trim()));
}
this.strategyTypeList = list;
}
}
/// <summary>
/// 算法列表
/// </summary>
private List<AlgorithmStrategyType> strategyTypeList;
#endregion
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value is AlgorithmStrategyType))
return this.NotContainsHeight;
AlgorithmStrategyType type = (AlgorithmStrategyType)value;
return this.strategyTypeList.Contains(type) ? this.ContainsHeight : this.NotContainsHeight;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
......@@ -122,10 +122,12 @@ namespace VIZ.H2V.Module.Resource
AlgorithmStrategyMode mode = (AlgorithmStrategyMode)values[1];
AlgorithmStrategyType type = (AlgorithmStrategyType)values[2];
return this.viewStatusList.Contains(status) &&
Visibility result = this.viewStatusList.Contains(status) &&
this.strategyModeList.Contains(mode) &&
this.strategyTypeList.Contains(type)
? Visibility.Visible : Visibility.Collapsed;
return result;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
......
......@@ -69,4 +69,40 @@
</Style.Triggers>
</Style>
<Style TargetType="RadioButton" x:Key="RadioButton_NdiView_Tool">
<Setter Property="FocusVisualStyle" Value="{x:Null}"></Setter>
<Setter Property="Foreground" Value="White"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Grid x:Name="bd_outer" Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="8"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Rectangle x:Name="rect" Fill="#22ffffff" Grid.Column="0"></Rectangle>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Grid.Column="1"></ContentPresenter>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="rect" Property="Fill" Value="#fff79b00"></Setter>
<Setter TargetName="bd_outer" Property="Background" Value="#11ffffff"></Setter>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="bd_outer" Property="Background" Value="#22ffffff"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.7"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
\ No newline at end of file
......@@ -120,6 +120,7 @@
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="Converter\AlgorithmStrategyType2FootballFieldHeightConverter.cs" />
<Compile Include="Converter\AlgorithmStrategyType2FootballFieldOrientationConverter.cs" />
<Compile Include="Converter\NDIViewProperty2VisibilityConverter.cs" />
<Compile Include="Converter\NDIViewProperty2BoolConverter.cs" />
......
......@@ -40,6 +40,7 @@
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<!-- 无球时自动跟人 -->
......@@ -172,6 +173,16 @@
</ComboBox>
</Grid>
<!-- 手动校准半径 -->
<Grid Grid.Row="8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="380"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Text="手动校准半径(像素)" Foreground="White" FontSize="18" VerticalAlignment="Center"></TextBlock>
<fcommon:NumberBox Grid.Column="1" MinValue="200" MaxValue="400" Interval="1" Height="40"
Value="{Binding Path=ManualCorrectionRadius,Mode=TwoWay}"></fcommon:NumberBox>
</Grid>
</Grid>
</Border>
</UserControl>
\ No newline at end of file
......@@ -40,6 +40,7 @@
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<!-- 无球时自动跟人 -->
......@@ -172,6 +173,16 @@
</ComboBox>
</Grid>
<!-- 手动校准半径 -->
<Grid Grid.Row="8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="380"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Text="手动校准半径(像素)" Foreground="White" FontSize="18" VerticalAlignment="Center"></TextBlock>
<fcommon:NumberBox Grid.Column="1" MinValue="200" MaxValue="400" Interval="1" Height="40"
Value="{Binding Path=ManualCorrectionRadius,Mode=TwoWay}"></fcommon:NumberBox>
</Grid>
</Grid>
</Border>
</UserControl>
......@@ -40,6 +40,7 @@
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<!-- 无球时自动跟人 -->
......@@ -172,6 +173,16 @@
</ComboBox>
</Grid>
<!-- 手动校准半径 -->
<Grid Grid.Row="8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="380"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Text="手动校准半径(像素)" Foreground="White" FontSize="18" VerticalAlignment="Center"></TextBlock>
<fcommon:NumberBox Grid.Column="1" MinValue="200" MaxValue="400" Interval="1" Height="40"
Value="{Binding Path=ManualCorrectionRadius,Mode=TwoWay}"></fcommon:NumberBox>
</Grid>
</Grid>
</Border>
</UserControl>
\ No newline at end of file
......@@ -40,6 +40,7 @@
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<!-- 无球时自动跟人 -->
......@@ -172,6 +173,16 @@
</ComboBox>
</Grid>
<!-- 手动校准半径 -->
<Grid Grid.Row="8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="380"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Text="手动校准半径(像素)" Foreground="White" FontSize="18" VerticalAlignment="Center"></TextBlock>
<fcommon:NumberBox Grid.Column="1" MinValue="200" MaxValue="400" Interval="1" Height="40"
Value="{Binding Path=ManualCorrectionRadius,Mode=TwoWay}"></fcommon:NumberBox>
</Grid>
</Grid>
</Border>
</UserControl>
\ No newline at end of file
......@@ -112,6 +112,20 @@ namespace VIZ.H2V.Module
#endregion
#region ManualCorrectionRadius -- 手动校准半径
private double manualCorrectionRadius;
/// <summary>
/// 手动校准半径
/// </summary>
public double ManualCorrectionRadius
{
get { return manualCorrectionRadius; }
set { manualCorrectionRadius = value; this.RaisePropertyChanged(nameof(ManualCorrectionRadius)); }
}
#endregion
// ======================================================================================
// === Command ===
// ======================================================================================
......@@ -139,6 +153,7 @@ namespace VIZ.H2V.Module
this.NoBallAutoChangeToPerson = config.NoBallAutoChangeToPerson;
this.SmoothCoeff = config.SmoothCoeff;
this.KeepPrevFrame = config.KeepPrevFrame;
this.ManualCorrectionRadius = config.ManualCorrectionRadius;
// 场景信息
this.SelectedBorderScence = this.BorderScences?.FirstOrDefault(p => p.Key == this.Config.BorderScene) ?? this.BorderScences?.FirstOrDefault();
......@@ -183,6 +198,9 @@ namespace VIZ.H2V.Module
if (this.SelectedBorderScence.Key != this.Config.BorderScene)
return true;
if (this.ManualCorrectionRadius != this.Config.ManualCorrectionRadius)
return true;
return false;
}
......@@ -220,6 +238,7 @@ namespace VIZ.H2V.Module
this.Config.SmoothCoeff = this.SmoothCoeff;
this.Config.KeepPrevFrame = this.KeepPrevFrame;
this.Config.BorderScene = this.SelectedBorderScence.Key;
this.Config.ManualCorrectionRadius = this.ManualCorrectionRadius;
this.ViewConfig.GPU = this.SelectedGpuInfo?.Physics ?? 0;
ApplicationDomainEx.LiteDbContext.AlgorithmCableway.Upsert(this.Config);
......
......@@ -114,6 +114,20 @@ namespace VIZ.H2V.Module
#endregion
#region ManualCorrectionRadius -- 手动校准半径
private double manualCorrectionRadius;
/// <summary>
/// 手动校准半径
/// </summary>
public double ManualCorrectionRadius
{
get { return manualCorrectionRadius; }
set { manualCorrectionRadius = value; this.RaisePropertyChanged(nameof(ManualCorrectionRadius)); }
}
#endregion
// ======================================================================================
// === Command ===
// ======================================================================================
......@@ -141,6 +155,7 @@ namespace VIZ.H2V.Module
this.NoBallAutoChangeToPerson = config.NoBallAutoChangeToPerson;
this.SmoothCoeff = config.SmoothCoeff;
this.KeepPrevFrame = config.KeepPrevFrame;
this.ManualCorrectionRadius = config.ManualCorrectionRadius;
// 场景信息
this.SelectedBorderScence = this.BorderScences?.FirstOrDefault(p => p.Key == this.Config.BorderScene) ?? this.BorderScences?.FirstOrDefault();
......@@ -185,6 +200,9 @@ namespace VIZ.H2V.Module
if (this.SelectedBorderScence.Key != this.Config.BorderScene)
return true;
if (this.ManualCorrectionRadius != this.Config.ManualCorrectionRadius)
return true;
return false;
}
......@@ -222,6 +240,7 @@ namespace VIZ.H2V.Module
this.Config.SmoothCoeff = this.SmoothCoeff;
this.Config.KeepPrevFrame = this.KeepPrevFrame;
this.Config.BorderScene = this.SelectedBorderScence.Key;
this.Config.ManualCorrectionRadius = this.ManualCorrectionRadius;
ApplicationDomainEx.LiteDbContext.AlgorithmNear.Upsert(this.Config);
......
......@@ -112,6 +112,20 @@ namespace VIZ.H2V.Module
#endregion
#region ManualCorrectionRadius -- 手动校准半径
private double manualCorrectionRadius;
/// <summary>
/// 手动校准半径
/// </summary>
public double ManualCorrectionRadius
{
get { return manualCorrectionRadius; }
set { manualCorrectionRadius = value; this.RaisePropertyChanged(nameof(ManualCorrectionRadius)); }
}
#endregion
// ======================================================================================
// === Command ===
// ======================================================================================
......@@ -139,6 +153,7 @@ namespace VIZ.H2V.Module
this.NoBallAutoChangeToPerson = config.NoBallAutoChangeToPerson;
this.SmoothCoeff = config.SmoothCoeff;
this.KeepPrevFrame = config.KeepPrevFrame;
this.ManualCorrectionRadius = config.ManualCorrectionRadius;
// 场景信息
this.SelectedBorderScence = this.BorderScences?.FirstOrDefault(p => p.Key == this.Config.BorderScene) ?? this.BorderScences?.FirstOrDefault();
......@@ -183,6 +198,9 @@ namespace VIZ.H2V.Module
if (this.SelectedBorderScence.Key != this.Config.BorderScene)
return true;
if (this.ManualCorrectionRadius != this.Config.ManualCorrectionRadius)
return true;
return false;
}
......@@ -220,6 +238,7 @@ namespace VIZ.H2V.Module
this.Config.SmoothCoeff = this.SmoothCoeff;
this.Config.KeepPrevFrame = this.KeepPrevFrame;
this.Config.BorderScene = this.SelectedBorderScence.Key;
this.Config.ManualCorrectionRadius = this.ManualCorrectionRadius;
this.ViewConfig.GPU = this.SelectedGpuInfo?.Physics ?? 0;
ApplicationDomainEx.LiteDbContext.AlgorithmSixteen.Upsert(this.Config);
......
......@@ -112,6 +112,20 @@ namespace VIZ.H2V.Module
#endregion
#region ManualCorrectionRadius -- 手动校准半径
private double manualCorrectionRadius;
/// <summary>
/// 手动校准半径
/// </summary>
public double ManualCorrectionRadius
{
get { return manualCorrectionRadius; }
set { manualCorrectionRadius = value; this.RaisePropertyChanged(nameof(ManualCorrectionRadius)); }
}
#endregion
// ======================================================================================
// === Command ===
// ======================================================================================
......@@ -139,6 +153,7 @@ namespace VIZ.H2V.Module
this.NoBallAutoChangeToPerson = config.NoBallAutoChangeToPerson;
this.SmoothCoeff = config.SmoothCoeff;
this.KeepPrevFrame = config.KeepPrevFrame;
this.ManualCorrectionRadius = config.ManualCorrectionRadius;
// 场景信息
this.SelectedBorderScence = this.BorderScences?.FirstOrDefault(p => p.Key == this.Config.BorderScene) ?? this.BorderScences?.FirstOrDefault();
......@@ -183,6 +198,9 @@ namespace VIZ.H2V.Module
if (this.SelectedBorderScence.Key != this.Config.BorderScene)
return true;
if (this.ManualCorrectionRadius != this.Config.ManualCorrectionRadius)
return true;
return false;
}
......@@ -220,6 +238,7 @@ namespace VIZ.H2V.Module
this.Config.SmoothCoeff = this.SmoothCoeff;
this.Config.KeepPrevFrame = this.KeepPrevFrame;
this.Config.BorderScene = this.SelectedBorderScence.Key;
this.Config.ManualCorrectionRadius = this.ManualCorrectionRadius;
this.ViewConfig.GPU = this.SelectedGpuInfo?.Physics ?? 0;
ApplicationDomainEx.LiteDbContext.AlgorithmTactics.Upsert(this.Config);
......
......@@ -205,6 +205,12 @@ namespace VIZ.H2V.Module
public abstract void BorderPoint(AlgorithmInfo_borderpoint boarderpoint);
/// <summary>
/// 手动校准
/// </summary>
/// <param name="info">手动校准信息</param>
public abstract void ManualCorrection(ManualCorrectionInfo info);
/// <summary>
/// 获取配置信息
/// </summary>
/// <returns>配置信息</returns>
......
......@@ -65,6 +65,12 @@ namespace VIZ.H2V.Module
void BorderPoint(AlgorithmInfo_borderpoint borderpoint);
/// <summary>
/// 手动校准
/// </summary>
/// <param name="info">手动校准信息</param>
void ManualCorrection(ManualCorrectionInfo info);
/// <summary>
/// 初始化算法
/// </summary>
/// <remarks>
......
......@@ -37,7 +37,7 @@ namespace VIZ.H2V.Module
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
AlgorithmPackage__auto_mode_Cableway package = this.BuildPackage(null);
AlgorithmPackage__auto_mode_Cableway package = this.BuildPackage(null, null);
package.signal = AlgorithmPackageSignal.no_mode;
AlgorithmSender.AutoMode(manager, package, option);
}
......@@ -67,7 +67,7 @@ namespace VIZ.H2V.Module
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params), option);
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null), option);
}
/// <summary>
......@@ -98,7 +98,7 @@ namespace VIZ.H2V.Module
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params), option);
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null), option);
}
/// <summary>
......@@ -111,6 +111,26 @@ namespace VIZ.H2V.Module
}
/// <summary>
/// 手动校准
/// </summary>
/// <param name="info">手动校准信息</param>
public override void ManualCorrection(ManualCorrectionInfo info)
{
if (info == null)
return;
UdpEndpointManager manager = ConnectionManager.UdpConnection.GetEndpointManager(this.Support.ViewKey);
AlgorithmSenderOption option = new AlgorithmSenderOption();
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
List<int> correction_area = new List<int>() { (int)info.SrcCenter.X, (int)info.SrcCenter.Y, (int)info.SrcRadius };
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.manual_correction, correction_area), option);
}
/// <summary>
/// 获取配置信息
/// </summary>
/// <returns>配置信息</returns>
......@@ -136,8 +156,9 @@ namespace VIZ.H2V.Module
/// 构建数据包
/// </summary>
/// <param name="cmd">命令<see cref="AlgorithmAutoModeCmd"/></param>
/// <param name="correction_area">人工校准区域</param>
/// <returns>数据包</returns>
public AlgorithmPackage__auto_mode_Cableway BuildPackage(string cmd)
public AlgorithmPackage__auto_mode_Cableway BuildPackage(string cmd, List<int> correction_area)
{
AlgorithmCableway config = ApplicationDomainEx.LiteDbContext.AlgorithmCableway.FindOne(p => p.ViewKey == this.Support.ViewKey);
if (config == null)
......@@ -155,6 +176,7 @@ namespace VIZ.H2V.Module
package.auto_follow_human = config.NoBallAutoChangeToPerson ? 1 : 0;
package.border_scene = config.BorderScene;
package.border_on = config.IsBorderEnabled ? 1 : 0;
package.correction_area = correction_area;
return package;
}
......
......@@ -37,7 +37,7 @@ namespace VIZ.H2V.Module
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
AlgorithmPackage__auto_mode_Near package = this.BuildPackage(null, null);
AlgorithmPackage__auto_mode_Near package = this.BuildPackage(null, null, null);
package.signal = AlgorithmPackageSignal.no_mode;
AlgorithmSender.AutoMode(manager, package, option);
......@@ -68,7 +68,7 @@ namespace VIZ.H2V.Module
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null), option);
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null, null), option);
}
/// <summary>
......@@ -99,7 +99,7 @@ namespace VIZ.H2V.Module
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null), option);
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null, null), option);
}
/// <summary>
......@@ -116,9 +116,28 @@ namespace VIZ.H2V.Module
AlgorithmSenderOption option = new AlgorithmSenderOption();
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
option.borderpoint = new AlgorithmInfo_borderpoint();
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.borderline_correction, borderpoint), option);
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.borderline_correction, borderpoint, null), option);
}
/// <summary>
/// 手动校准
/// </summary>
/// <param name="info">手动校准信息</param>
public override void ManualCorrection(ManualCorrectionInfo info)
{
if (info == null)
return;
UdpEndpointManager manager = ConnectionManager.UdpConnection.GetEndpointManager(this.Support.ViewKey);
AlgorithmSenderOption option = new AlgorithmSenderOption();
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
List<int> correction_area = new List<int>() { (int)info.SrcCenter.X, (int)info.SrcCenter.Y, (int)info.SrcRadius };
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.manual_correction, null, correction_area), option);
}
/// <summary>
......@@ -148,8 +167,9 @@ namespace VIZ.H2V.Module
/// </summary>
/// <param name="cmd">命令<see cref="AlgorithmAutoModeCmd"/></param>
/// <param name="boarderpoint">边框检测点</param>
/// <param name="correction_area">手动裁切区域</param>
/// <returns>数据包</returns>
private AlgorithmPackage__auto_mode_Near BuildPackage(string cmd, AlgorithmInfo_borderpoint boarderpoint)
private AlgorithmPackage__auto_mode_Near BuildPackage(string cmd, AlgorithmInfo_borderpoint boarderpoint, List<int> correction_area)
{
AlgorithmNear config = ApplicationDomainEx.LiteDbContext.AlgorithmNear.FindOne(p => p.ViewKey == this.Support.ViewKey);
if (config == null)
......@@ -168,6 +188,7 @@ namespace VIZ.H2V.Module
package.borderpoint = boarderpoint;
package.border_scene = config.BorderScene;
package.border_on = config.IsBorderEnabled ? 1 : 0;
package.correction_area = correction_area;
return package;
}
......
......@@ -130,6 +130,15 @@ namespace VIZ.H2V.Module
}
/// <summary>
/// 手动校准
/// </summary>
/// <param name="info">手动校准信息</param>
public override void ManualCorrection(ManualCorrectionInfo info)
{
}
/// <summary>
/// 获取配置信息
/// </summary>
/// <returns>配置信息</returns>
......
......@@ -37,7 +37,7 @@ namespace VIZ.H2V.Module
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
AlgorithmPackage__auto_mode_Sixteen package = this.BuildPackage(null, null);
AlgorithmPackage__auto_mode_Sixteen package = this.BuildPackage(null, null, null);
package.signal = AlgorithmPackageSignal.no_mode;
AlgorithmSender.AutoMode(manager, package, option);
......@@ -68,7 +68,7 @@ namespace VIZ.H2V.Module
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null), option);
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null, null), option);
}
/// <summary>
......@@ -99,7 +99,7 @@ namespace VIZ.H2V.Module
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null), option);
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null, null), option);
}
/// <summary>
......@@ -116,9 +116,28 @@ namespace VIZ.H2V.Module
AlgorithmSenderOption option = new AlgorithmSenderOption();
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
option.borderpoint = new AlgorithmInfo_borderpoint();
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.borderline_correction, borderpoint), option);
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.borderline_correction, borderpoint, null), option);
}
/// <summary>
/// 手动校准
/// </summary>
/// <param name="info">手动校准信息</param>
public override void ManualCorrection(ManualCorrectionInfo info)
{
if (info == null)
return;
UdpEndpointManager manager = ConnectionManager.UdpConnection.GetEndpointManager(this.Support.ViewKey);
AlgorithmSenderOption option = new AlgorithmSenderOption();
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
List<int> correction_area = new List<int>() { (int)info.SrcCenter.X, (int)info.SrcCenter.Y, (int)info.SrcRadius };
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.manual_correction, null, correction_area), option);
}
/// <summary>
......@@ -148,8 +167,9 @@ namespace VIZ.H2V.Module
/// </summary>
/// <param name="cmd">命令<see cref="AlgorithmAutoModeCmd"/></param>
/// <param name="boarderpoint">边框检测点</param>
/// <param name="correction_area">手动校准区域</param>
/// <returns>数据包</returns>
public AlgorithmPackage__auto_mode_Sixteen BuildPackage(string cmd, AlgorithmInfo_borderpoint boarderpoint)
public AlgorithmPackage__auto_mode_Sixteen BuildPackage(string cmd, AlgorithmInfo_borderpoint boarderpoint, List<int> correction_area)
{
AlgorithmSixteen config = ApplicationDomainEx.LiteDbContext.AlgorithmSixteen.FindOne(p => p.ViewKey == this.Support.ViewKey);
if (config == null)
......@@ -168,6 +188,7 @@ namespace VIZ.H2V.Module
package.borderpoint = boarderpoint;
package.border_scene = config.BorderScene;
package.border_on = config.IsBorderEnabled ? 1 : 0;
package.correction_area = correction_area;
return package;
}
......
......@@ -37,7 +37,7 @@ namespace VIZ.H2V.Module
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
AlgorithmPackage__auto_mode_Tactics package = this.BuildPackage(null, null);
AlgorithmPackage__auto_mode_Tactics package = this.BuildPackage(null, null, null);
package.signal = AlgorithmPackageSignal.no_mode;
AlgorithmSender.AutoMode(manager, package, option);
......@@ -68,7 +68,7 @@ namespace VIZ.H2V.Module
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null), option);
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null, null), option);
}
/// <summary>
......@@ -99,7 +99,7 @@ namespace VIZ.H2V.Module
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null), option);
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.set_params, null, null), option);
}
/// <summary>
......@@ -116,9 +116,28 @@ namespace VIZ.H2V.Module
AlgorithmSenderOption option = new AlgorithmSenderOption();
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
option.borderpoint = new AlgorithmInfo_borderpoint();
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.borderline_correction, borderpoint), option);
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.borderline_correction, borderpoint, null), option);
}
/// <summary>
/// 手动校准
/// </summary>
/// <param name="info">手动校准信息</param>
public override void ManualCorrection(ManualCorrectionInfo info)
{
if (info == null)
return;
UdpEndpointManager manager = ConnectionManager.UdpConnection.GetEndpointManager(this.Support.ViewKey);
AlgorithmSenderOption option = new AlgorithmSenderOption();
option.id = this.Support.ID;
option.enable_sendto_crop = this.Support.ViewConfig.IsSendToCrop;
List<int> correction_area = new List<int>() { (int)info.SrcCenter.X, (int)info.SrcCenter.Y, (int)info.SrcRadius };
AlgorithmSender.AutoMode(manager, this.BuildPackage(AlgorithmAutoModeCmd.manual_correction, null, correction_area), option);
}
/// <summary>
......@@ -148,8 +167,9 @@ namespace VIZ.H2V.Module
/// </summary>
/// <param name="cmd">命令<see cref="AlgorithmAutoModeCmd"/></param>
/// <param name="boarderpoint">边框检测点</param>
/// <param name="correction_area">手动校准区域</param>
/// <returns>数据包</returns>
public AlgorithmPackage__auto_mode_Tactics BuildPackage(string cmd, AlgorithmInfo_borderpoint boarderpoint)
public AlgorithmPackage__auto_mode_Tactics BuildPackage(string cmd, AlgorithmInfo_borderpoint boarderpoint, List<int> correction_area)
{
AlgorithmTactics config = ApplicationDomainEx.LiteDbContext.AlgorithmTactics.FindOne(p => p.ViewKey == this.Support.ViewKey);
if (config == null)
......@@ -168,6 +188,7 @@ namespace VIZ.H2V.Module
package.borderpoint = boarderpoint;
package.border_scene = config.BorderScene;
package.border_on = config.IsBorderEnabled ? 1 : 0;
package.correction_area = correction_area;
return package;
}
......
......@@ -24,6 +24,7 @@
<ResourceDictionary Source="/VIZ.H2V.Module.Resource;component/Style/RadioButton/RadioButton_NdiView.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
<fcore:Bool2BoolConverter x:Key="Bool2BoolConverter"></fcore:Bool2BoolConverter>
<fcore:StringAppendConverter x:Key="StringAppendConverter"></fcore:StringAppendConverter>
<resource:NDIViewStatus2BoolConverter x:Key="NDIViewStatus2IsEnabledConverter" TrueListString="Detect,CropRoi"></resource:NDIViewStatus2BoolConverter>
<resource:NDIViewStatus2BoolConverter x:Key="NDIViewStatus2IsEnabledConverter_SettingButton" TrueListString="Stop,Detect,CropRoi"></resource:NDIViewStatus2BoolConverter>
<resource:NDIViewStatus2BoolConverter x:Key="NDIViewStatus2IsEnabledConverter_StopButton" TrueListString="WaitSetup,WaitCheckOK,Detect,CropRoi"></resource:NDIViewStatus2BoolConverter>
......@@ -47,6 +48,16 @@
<resource:AlgorithmStrategyType2FootballFieldOrientationConverter x:Key="AlgorithmStrategyType2FootballFieldOrientationConverter"
StrategyTypeListString="Near,Tactics"></resource:AlgorithmStrategyType2FootballFieldOrientationConverter>
<resource:AlgorithmStrategyType2FootballFieldHeightConverter x:Key="AlgorithmStrategyType2FootballFieldHeightConverter"
StrategyTypeListString="Near,Tactics" NotContainsHeight="140" ContainsHeight="190">
</resource:AlgorithmStrategyType2FootballFieldHeightConverter>
<!-- 手动校准面板 -->
<resource:NDIViewProperty2VisibilityConverter x:Key="NDIViewProperty2VisibilityConverter_ManualCorrection"
ViewStatusListString="CropRoi"
StrategyModeListString="auto_mode"
StrategyTypeListString="Near,Sixteen,Tactics,Cableway">
</resource:NDIViewProperty2VisibilityConverter>
</ResourceDictionary>
</UserControl.Resources>
......@@ -157,22 +168,50 @@
</MultiBinding>
</Button.Visibility>
</Button>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Bottom">
<Grid.RowDefinitions>
<RowDefinition Height="50"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
</Grid.RowDefinitions>
<RadioButton Content="手动校准" Foreground="White" FontSize="20"
Style="{StaticResource RadioButton_NdiView_Tool}"
IsChecked="{Binding Path=ToolPartViewModel.IsManualCorrectionChecked,Mode=TwoWay}"
GroupName="{Binding Path=ViewKey,Converter={StaticResource StringAppendConverter}, ConverterParameter=Tool}"
HorizontalContentAlignment="Center" VerticalContentAlignment="Center">
<RadioButton.Visibility>
<MultiBinding Converter="{StaticResource NDIViewProperty2VisibilityConverter_ManualCorrection}">
<Binding Path="DataContext.ViewStatus" ElementName="uc"></Binding>
<Binding Path="DataContext.StrategyMode" ElementName="uc"></Binding>
<Binding Path="DataContext.StrategyType" ElementName="uc"></Binding>
</MultiBinding>
</RadioButton.Visibility>
</RadioButton>
<!-- 近景机位 & 16米机位 & 战术机位 ===== 边线检测选择面板 -->
<Border HorizontalAlignment="Center" VerticalAlignment="Bottom"
<Border Grid.Row="1"
Visibility="{Binding Path=AlgorithmConfig.IsShowBorder,Mode=OneWay,Converter={StaticResource Bool2VisibilityConverter}}">
<common:FootballFieldPanel FootballFieldWidth="150" FootballFieldHeight="100"
DataContext="{Binding Path=FootballFieldPanelModel}"
Orientation="{Binding ElementName=uc,Path=DataContext.StrategyType,Converter={StaticResource AlgorithmStrategyType2FootballFieldOrientationConverter}}">
<common:FootballFieldPanel.Visibility>
<RadioButton Style="{StaticResource RadioButton_NdiView_Tool}"
Height="{Binding ElementName=uc,Path=DataContext.StrategyType,Converter={StaticResource AlgorithmStrategyType2FootballFieldHeightConverter}}"
IsChecked="{Binding Path=ToolPartViewModel.IsSideCheckPolygonChecked,Mode=TwoWay}"
GroupName="{Binding Path=ViewKey,Converter={StaticResource StringAppendConverter}, ConverterParameter=Tool}"
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
<RadioButton.Visibility>
<MultiBinding Converter="{StaticResource NDIViewProperty2VisibilityConverter_FootballFieldPanel}">
<Binding Path="DataContext.ViewStatus" ElementName="uc"></Binding>
<Binding Path="DataContext.StrategyMode" ElementName="uc"></Binding>
<Binding Path="DataContext.StrategyType" ElementName="uc"></Binding>
</MultiBinding>
</common:FootballFieldPanel.Visibility>
</RadioButton.Visibility>
<common:FootballFieldPanel FootballFieldWidth="150" FootballFieldHeight="100"
DataContext="{Binding Path=FootballFieldPanelModel}"
Orientation="{Binding ElementName=uc,Path=DataContext.StrategyType,Converter={StaticResource AlgorithmStrategyType2FootballFieldOrientationConverter}}">
</common:FootballFieldPanel>
</RadioButton>
</Border>
</Grid>
</Grid>
<!-- 视频区域 -->
<Border BorderBrush="Transparent" BorderThickness="0" Grid.Row="1" Grid.Column="1">
<fcommon:VideoControl x:Name="video"></fcommon:VideoControl>
......
......@@ -128,6 +128,11 @@ namespace VIZ.H2V.Module
SideCheckPolygonPlugin sideCheckPolygonPlugin = new SideCheckPolygonPlugin(view.video);
sideCheckPolygonPlugin.Click += SideCheckPolygonPlugin_Click;
view.video.AttachPlugin(sideCheckPolygonPlugin);
// 手动校准插件
ManualCorrectionPlugin manualCorrectionPlugin = new ManualCorrectionPlugin(view.video);
manualCorrectionPlugin.Click += ManualCorrectionPlugin_Click;
view.video.AttachPlugin(manualCorrectionPlugin);
}
/// <summary>
......@@ -151,13 +156,6 @@ namespace VIZ.H2V.Module
return;
this.AlgorithmControllerDic[this.StrategyType].Tracking(e.HitTrackingBoxInfo);
// ====================================================================================
// DEBUG
//if (ApplicationDomainEx.IS_DEBUG)
//{
// this.DebugLog = $"点击跟踪框:[{e.HitTrackingBoxInfo.SrcRect.Left}, {e.HitTrackingBoxInfo.SrcRect.Top}, {e.HitTrackingBoxInfo.SrcRect.Right}, {e.HitTrackingBoxInfo.SrcRect.Bottom}]";
//}
}
/// <summary>
......@@ -165,6 +163,10 @@ namespace VIZ.H2V.Module
/// </summary>
private void SideCheckPolygonPlugin_Click(object sender, SideCheckPolygonClickEventArgs e)
{
// 当前模式需要在边线检测模式下处理
if (!this.ToolPartViewModel.IsSideCheckPolygonChecked)
return;
// 边线检测只能在自动裁切时触发
if (this.StrategyMode != AlgorithmStrategyMode.auto_mode)
return;
......@@ -197,16 +199,42 @@ namespace VIZ.H2V.Module
}
this.AlgorithmControllerDic[this.StrategyType].BorderPoint(borderpoint);
}
// ====================================================================================
// DEBUG
if (ApplicationDomainEx.IS_DEBUG)
/// <summary>
/// 手动校准点击事件
/// </summary>
private void ManualCorrectionPlugin_Click(object sender, ManualCorrectionClickEventArgs e)
{
this.DebugLog = $"点击边线检测点:{e.SrcPoint}";
}
}
// 当前需要在手动校准模式下处理
if (!this.ToolPartViewModel.IsManualCorrectionChecked)
return;
// 手动校准只能在自动裁切时触发
if (this.StrategyMode != AlgorithmStrategyMode.auto_mode)
return;
// 手动校准只能在当前状态为接收裁切状态时可以触发
if (this.ViewStatus != NDIViewStatus.CropRoi)
return;
// 单人模式不需要处理
if (this.StrategyType == AlgorithmStrategyType.Single)
return;
NDIView view = this.GetView<NDIView>();
if (view == null)
return;
ManualCorrectionInfo info = new ManualCorrectionInfo();
info.SrcCenter = new RawVector2((int)e.SrcPoint.X, (int)e.SrcPoint.Y);
info.SrcRadius = (float)this.AlgorithmConfig.ManualCorrectionRadius;
info.FillColor = this.ManualCorrectionColor;
// 向算法发送区域信息
this.AlgorithmControllerDic[this.StrategyType].ManualCorrection(info);
// 绘制区域信息
view.video.UpdateManualCorrection(info);
}
#endregion
......
......@@ -158,6 +158,9 @@ namespace VIZ.H2V.Module
// 更新边线检测框
this.OnAlgorithmMessage__crop_roi__borderline(msg, renderInfo, view);
// 更新手动校准区域
this.OnAlgorithmMessage__crop_roi__correction_area(msg, renderInfo, view);
// 更新算法帧率统计
this.AlgorithmFPS.CalcFps();
}
......@@ -283,6 +286,30 @@ namespace VIZ.H2V.Module
}
/// <summary>
/// 裁切信息更新 -- 更新手动校准区域
/// </summary>
/// <param name="msg">裁切消息</param>
/// <param name="renderInfo">渲染信息</param>
/// <param name="view">视图</param>
private void OnAlgorithmMessage__crop_roi__correction_area(AlgorithmMessage__crop_roi msg, VideoRenderInfo renderInfo, NDIView view)
{
if (msg.correction_area == null || msg.correction_area.Count != 3)
{
view.video.ClearManualCorrection();
return;
}
ManualCorrectionInfo manualCorrectionInfo = new ManualCorrectionInfo();
manualCorrectionInfo.SrcCenter = new RawVector2(msg.correction_area[0], msg.correction_area[1]);
manualCorrectionInfo.SrcRadius = msg.correction_area[2];
manualCorrectionInfo.FillColor = this.ManualCorrectionColor;
view.video.UpdateManualCorrection(manualCorrectionInfo);
}
/// <summary>
/// 构建边线多边形信息
/// </summary>
/// <param name="data">数据</param>
......
......@@ -59,6 +59,11 @@ namespace VIZ.H2V.Module
private readonly double VIDEO_SIDE_CHECK_POLYGON_OPACITY = ApplicationDomainEx.IniStorage.GetValue<VideoConfig, double>(p => p.VIDEO_SIDE_CHECK_POLYGON_OPACITY);
/// <summary>
/// 手动校准区域透明度
/// </summary>
private readonly double VIDEO_MANUAL_CORRECTION_OPACITY = ApplicationDomainEx.IniStorage.GetValue<VideoConfig, double>(p => p.VIDEO_MANUAL_CORRECTION_OPACITY);
/// <summary>
/// 是否显示目标框
/// </summary>
private readonly bool ALGORITHM_IS_SHOW_TARGET_BOX = ApplicationDomainEx.IniStorage.GetValue<AlgorithmConfig, bool>(p => p.ALGORITHM_IS_SHOW_TARGET_BOX);
......@@ -84,6 +89,11 @@ namespace VIZ.H2V.Module
/// </summary>
private RawColor4 BorderSceneColor;
/// <summary>
/// 人工校准填充颜色
/// </summary>
private RawColor4 ManualCorrectionColor;
// ======================================================================================
// === Controller ===
// ======================================================================================
......@@ -483,6 +493,20 @@ namespace VIZ.H2V.Module
#endregion
#region ToolPartViewModel -- 工具部分视图模型
private NDIViewToolPartViewModel toolPartViewModel = new NDIViewToolPartViewModel();
/// <summary>
/// 工具部分视图模型
/// </summary>
public NDIViewToolPartViewModel ToolPartViewModel
{
get { return toolPartViewModel; }
set { toolPartViewModel = value; this.RaisePropertyChanged(nameof(ToolPartViewModel)); }
}
#endregion
#region DebugLog -- 调试日志
private string debugLog;
......
......@@ -282,6 +282,10 @@ namespace VIZ.H2V.Module
RawColor4 borderSceneColor = SharpDxColorHelper.FromString(config.BorderSceneColor);
borderSceneColor.A = (float)this.VIDEO_SIDE_CHECK_POLYGON_OPACITY;
this.BorderSceneColor = borderSceneColor;
RawColor4 manualCorrectionColor = SharpDxColorHelper.FromString(config.ManualCorrectionColor);
manualCorrectionColor.A = (float)this.VIDEO_MANUAL_CORRECTION_OPACITY;
this.ManualCorrectionColor = manualCorrectionColor;
}
/// <summary>
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VIZ.Framework.Core;
namespace VIZ.H2V.Module
{
/// <summary>
/// NDI视图工具部分视图模型
/// </summary>
public class NDIViewToolPartViewModel : ModelBase
{
#region IsManualCorrectionChecked -- 手动校准是否选中
private bool isManualCorrectionChecked = true;
/// <summary>
/// 手动校准是否选中
/// </summary>
public bool IsManualCorrectionChecked
{
get { return isManualCorrectionChecked; }
set { isManualCorrectionChecked = value; this.RaisePropertyChanged(nameof(IsManualCorrectionChecked)); }
}
#endregion
#region IsSideCheckPolygonChecked -- 边线检测是否选中
private bool isSideCheckPolygonChecked;
/// <summary>
/// 边线检测是否选中
/// </summary>
public bool IsSideCheckPolygonChecked
{
get { return isSideCheckPolygonChecked; }
set { isSideCheckPolygonChecked = value; this.RaisePropertyChanged(nameof(IsSideCheckPolygonChecked)); }
}
#endregion
}
}
......@@ -37,6 +37,7 @@
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<!-- 剪切框颜色 -->
......@@ -72,9 +73,18 @@
<TextBlock Text="边线检测区域颜色" Foreground="White" FontSize="18" VerticalAlignment="Center" Grid.Row="2"></TextBlock>
<fcommon:ColorPickButton Grid.Column="1" Color="{Binding Path=BorderSceneColor,Mode=TwoWay}" Height="30" Grid.Row="2"></fcommon:ColorPickButton>
</Grid>
<!-- 手动校准颜色 -->
<Grid Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Text="手动校准颜色" Foreground="White" FontSize="18" VerticalAlignment="Center" Grid.Row="2"></TextBlock>
<fcommon:ColorPickButton Grid.Column="1" Color="{Binding Path=ManualCorrectionColor,Mode=TwoWay}" Height="30" Grid.Row="2"></fcommon:ColorPickButton>
</Grid>
<!-- 裁切框移动 -->
<TextBlock Text="裁切框移动" Foreground="White" FontSize="18" VerticalAlignment="Center" Grid.Row="3"></TextBlock>
<Grid Grid.Row="4">
<TextBlock Text="裁切框移动" Foreground="White" FontSize="18" VerticalAlignment="Center" Grid.Row="4"></TextBlock>
<Grid Grid.Row="5">
<Grid.RowDefinitions>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
......
......@@ -90,6 +90,20 @@ namespace VIZ.H2V.Module
#endregion
#region ManualCorrectionColor -- 手动校准颜色
private Color manualCorrectionColor;
/// <summary>
/// 手动校准颜色
/// </summary>
public Color ManualCorrectionColor
{
get { return manualCorrectionColor; }
set { manualCorrectionColor = value; this.RaisePropertyChanged(nameof(ManualCorrectionColor)); }
}
#endregion
#region ManualSmoothCoeff -- 手动裁切平滑系数
private double manualSmoothCoeff;
......@@ -129,6 +143,7 @@ namespace VIZ.H2V.Module
this.ClipExceptionColor = (Color)ColorConverter.ConvertFromString(this.SystemConfig.ClipExceptionColor);
this.ClipManualColor = (Color)ColorConverter.ConvertFromString(this.SystemConfig.ClipManualColor);
this.BorderSceneColor = (Color)ColorConverter.ConvertFromString(this.SystemConfig.BorderSceneColor);
this.ManualCorrectionColor = (Color)ColorConverter.ConvertFromString(this.SystemConfig.ManualCorrectionColor);
this.ManualSmoothCoeff = this.SystemConfig.ManualSmoothCoeff;
}
......@@ -157,6 +172,9 @@ namespace VIZ.H2V.Module
if (this.BorderSceneColor.ToString() != this.SystemConfig.BorderSceneColor)
return true;
if (this.ManualCorrectionColor.ToString() != this.SystemConfig.ManualCorrectionColor)
return true;
if (this.ManualSmoothCoeff != this.SystemConfig.ManualSmoothCoeff)
return true;
......@@ -174,6 +192,7 @@ namespace VIZ.H2V.Module
this.SystemConfig.ClipExceptionColor = this.ClipExceptionColor.ToString();
this.SystemConfig.ClipManualColor = this.ClipManualColor.ToString();
this.SystemConfig.BorderSceneColor = this.BorderSceneColor.ToString();
this.SystemConfig.ManualCorrectionColor = this.ManualCorrectionColor.ToString();
this.SystemConfig.ManualSmoothCoeff = this.ManualSmoothCoeff;
ApplicationDomainEx.LiteDbContext.SystemConfig.Update(this.SystemConfig);
......
......@@ -246,6 +246,7 @@
<Compile Include="NDIView\VieweModel\NDIViewModel.Message.cs" />
<Compile Include="NDIView\VieweModel\NDIViewModel.Property.cs" />
<Compile Include="NDIView\VieweModel\NDIViewModel.cs" />
<Compile Include="NDIView\VieweModel\Part\NDIViewToolPartViewModel.cs" />
<Compile Include="Setup\Provider\AppSetup_Algorithm.cs" />
<Compile Include="Setup\Provider\AppSetup_Recording.cs" />
<Compile Include="Setup\Provider\AppSetup_InitUDP.cs" />
......
......@@ -48,5 +48,10 @@ namespace VIZ.H2V.Storage
/// 是否显示边线检测
/// </summary>
public bool IsShowBorder { get; set; } = true;
/// <summary>
/// 手动校准半径
/// </summary>
public double ManualCorrectionRadius { get; set; } = 200;
}
}
......@@ -35,7 +35,12 @@ namespace VIZ.H2V.Storage
/// <summary>
/// 边线检测区域颜色
/// </summary>
public string BorderSceneColor { get; set; } = "#FFFF000000";
public string BorderSceneColor { get; set; } = "#FFFF0000";
/// <summary>
/// 手动校准区域颜色
/// </summary>
public string ManualCorrectionColor { get; set; } = "#FFFF0000";
/// <summary>
/// 手动裁切平滑系数
......
......@@ -26,7 +26,7 @@ namespace VIZ.H2V.UdpTestTool
// 设置默认值
this.check_ok = $"{{'signal':'checked_ok','id':'{UdpTestApplicationDomain.AlgorithmID}' }}";
this.detect = $"{{'signal':'detect','id':'{UdpTestApplicationDomain.AlgorithmID}', 'bboxes': [[100,100,200,300],[400,200,600,600]] }}";
this.crop_roi = $"{{'signal':'crop_roi','id':'{UdpTestApplicationDomain.AlgorithmID}', 'roi': [400,0,1200,1080], 'target_bbox': [500,100,600,400], 'borderline':{{ 'up': [[100,100],[500,200],[300,400],[200,100],[100,100]] }} }}";
this.crop_roi = $"{{'signal':'crop_roi','id':'{UdpTestApplicationDomain.AlgorithmID}', 'roi': [400,0,1200,1080], 'target_bbox': [500,100,600,400], 'borderline':{{ 'up': [[100,100],[500,200],[300,400],[200,100],[100,100]] }},'correction_area':[200,200,200]}}";
// 注册命令
this.SendCommand_check_ok = new VCommand(this.Send_check_ok);
......
......@@ -42,6 +42,8 @@ VIDEO_CLIP_BOX_BORDER_COLOR=#FFFF0000
VIDEO_CLIP_BOX_MASK_COLOR=#88000000
;视频边线检测多边形区域透明度
VIDEO_SIDE_CHECK_POLYGON_OPACITY=0.15
;视频人工校准区域透明度
VIDEO_MANUAL_CORRECTION_OPACITY=0.2
; ============================================================
; === Navigation3D ===
; ============================================================
......
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