mirror of
https://github.com/azaion/annotations.git
synced 2026-04-22 09:46:30 +00:00
fix coma bug
add simple help window
This commit is contained in:
@@ -17,6 +17,7 @@ public partial class App : Application
|
||||
{
|
||||
var services = new ServiceCollection();
|
||||
services.AddSingleton<MainWindow>();
|
||||
services.AddSingleton<HelpWindow>();
|
||||
services.AddMediatR(c => c.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()));
|
||||
services.AddSingleton<LibVLC>(_ => new LibVLC());
|
||||
services.AddSingleton<FormState>();
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Windows;
|
||||
using System.Globalization;
|
||||
using System.Windows;
|
||||
|
||||
namespace Azaion.Annotator.DTO;
|
||||
|
||||
@@ -20,7 +21,15 @@ public class AnnotationInfo
|
||||
Height = height;
|
||||
}
|
||||
|
||||
public override string ToString() => $"{ClassNumber} {X:F5} {Y:F5} {Width:F5} {Height:F5}";
|
||||
public override string ToString() => string.Concat(ClassNumber.ToString(),
|
||||
" ",
|
||||
X.ToString("F5", CultureInfo.InvariantCulture),
|
||||
" ",
|
||||
Y.ToString("F5", CultureInfo.InvariantCulture),
|
||||
" ",
|
||||
Width.ToString("F5", CultureInfo.InvariantCulture),
|
||||
" ",
|
||||
Height.ToString("F5", CultureInfo.InvariantCulture));
|
||||
|
||||
public AnnotationInfo ToLabelCoordinates(Size canvasSize, Size videoSize)
|
||||
{
|
||||
@@ -96,20 +105,21 @@ public class AnnotationInfo
|
||||
if (s == null || string.IsNullOrEmpty(s))
|
||||
return null;
|
||||
|
||||
var strs = s.Split(' ');
|
||||
var strs = s.Replace(',','.').Split(' ');
|
||||
if (strs.Length != 5)
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
return new AnnotationInfo
|
||||
var res = new AnnotationInfo
|
||||
{
|
||||
ClassNumber = int.Parse(strs[0]),
|
||||
X = double.Parse(strs[1]),
|
||||
Y = double.Parse(strs[2]),
|
||||
Width = double.Parse(strs[3]),
|
||||
Height = double.Parse(strs[4])
|
||||
ClassNumber = int.Parse(strs[0], CultureInfo.InvariantCulture),
|
||||
X = double.Parse(strs[1], CultureInfo.InvariantCulture),
|
||||
Y = double.Parse(strs[2], CultureInfo.InvariantCulture),
|
||||
Width = double.Parse(strs[3], CultureInfo.InvariantCulture),
|
||||
Height = double.Parse(strs[4], CultureInfo.InvariantCulture)
|
||||
};
|
||||
return res;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
@@ -25,6 +25,7 @@ public class Config
|
||||
public List<AnnotationClass> AnnotationClasses { get; set; } = [];
|
||||
public Size WindowSize { get; set; }
|
||||
public Point WindowLocation { get; set; }
|
||||
public bool ShowHelpOnStart { get; set; }
|
||||
|
||||
public void Save()
|
||||
{
|
||||
@@ -42,7 +43,8 @@ public class Config
|
||||
LabelsDirectory = Path.Combine(exePath, DEFAULT_LABELS_DIR),
|
||||
ImagesDirectory = Path.Combine(exePath, DEFAULT_IMAGES_DIR),
|
||||
WindowLocation = DefaultWindowLocation,
|
||||
WindowSize = DefaultWindowSize
|
||||
WindowSize = DefaultWindowSize,
|
||||
ShowHelpOnStart = true
|
||||
};
|
||||
}
|
||||
try
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
<Window x:Class="Azaion.Annotator.HelpWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:Azaion.Annotator"
|
||||
mc:Ignorable="d"
|
||||
Title="HelpWindow" Height="450" Width="800">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Grid.Row="0" TextWrapping="Wrap" FontSize="18" >
|
||||
Анотація - це виділений на кадрі відео об'єкт з якимось класом (Броньована техніка, вантажівка, тощо)
|
||||
</TextBlock>
|
||||
<TextBlock Grid.Row="1" TextWrapping="Wrap" FontSize="18" >
|
||||
1. Анотації мусять містити об'єкти найкращої чіткості та якості. Сильно розмазані чи задимлені об'єкти не підходять
|
||||
</TextBlock>
|
||||
<TextBlock Grid.Row="2" TextWrapping="Wrap" FontSize="18" >
|
||||
2. Чим більше ракурсів одного і того самого об'єкту - тим краще. Наприклад, якщо на відео об'єкт малий, а далі на нього наводиться камера, то треба анотувати як малий об'єкт, так і великий. Якщо об'єкт статичний і ракурс не змінюється, достатньо одної анотації, а якщо рухається, і видно об'єкт з різних боків - то треба кілька, по 1 на ракурс
|
||||
</TextBlock>
|
||||
<TextBlock Grid.Row="3" TextWrapping="Wrap" FontSize="18" >
|
||||
3. Анотація об'єктів з формою що суттєво відрізняється від прямокутника. Наприклад, якщо танк має довге дуло, саме дуло не треба виділяти, оскільки попадає в анотацію дуже багато зайвого. Те ж саме з окопами - якщо окопи займають візуально багато місця, і в квадрат буде попадати багато зайвого, то краще зробити декілька малих анотацій саме окопів
|
||||
</TextBlock>
|
||||
<TextBlock Grid.Row="4" TextWrapping="Wrap" FontSize="18" >
|
||||
4. Будь-які існуючі позначки на відео, OSD і інше не мусять бути в анотаціях. Анотація мусить мати лише конкретний об'єкт без ліній на ньому
|
||||
</TextBlock>
|
||||
<TextBlock Grid.Row="5" TextWrapping="Wrap" FontSize="18" >
|
||||
5. До кожного відео мусить бути декілька фоток без анотацій, для гарнішого навчання
|
||||
</TextBlock>
|
||||
<TextBlock Grid.Row="6" TextWrapping="Wrap" FontSize="18" >
|
||||
6. Артилерія - це гармати, міномети. Якщо це САУ наприклад, або будь що на гусеничній техніці, це Броньована техніка.
|
||||
</TextBlock>
|
||||
<CheckBox Grid.Row="7" x:Name="CbShowHelp" IsChecked="{Binding Path=ShowHelpOnStart}">
|
||||
Показувати при запуску
|
||||
</CheckBox>
|
||||
<Button Grid.Row="8" Click="Close" IsEnabledChanged="UIElement_OnIsEnabledChanged">
|
||||
Закрити
|
||||
</Button>
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,27 @@
|
||||
using System.Windows;
|
||||
using Azaion.Annotator.DTO;
|
||||
|
||||
namespace Azaion.Annotator;
|
||||
|
||||
public partial class HelpWindow : Window
|
||||
{
|
||||
public bool ShowHelpOnStart { get; set; }
|
||||
private readonly Config _config;
|
||||
|
||||
public HelpWindow(Config config)
|
||||
{
|
||||
_config = config;
|
||||
ShowHelpOnStart = config.ShowHelpOnStart;
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void Close(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
private void UIElement_OnIsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
_config.ShowHelpOnStart = CbShowHelp.IsChecked ?? true;
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,8 @@ using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Windows;
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Threading;
|
||||
using Azaion.Annotator.DTO;
|
||||
using Azaion.Annotator.Extensions;
|
||||
using LibVLCSharp.Shared;
|
||||
@@ -19,6 +21,7 @@ public partial class MainWindow
|
||||
private readonly FormState _formState;
|
||||
|
||||
private readonly Config _config;
|
||||
private readonly HelpWindow _helpWindow;
|
||||
private readonly TimeSpan _annotationTime = TimeSpan.FromSeconds(1);
|
||||
|
||||
public ObservableCollection<AnnotationClass> AnnotationClasses { get; set; }
|
||||
@@ -26,10 +29,13 @@ public partial class MainWindow
|
||||
|
||||
public Dictionary<string, List<AnnotationInfo>> Annotations { get; set; } = new();
|
||||
|
||||
public bool ShowHelpOnStart { get; set; }
|
||||
|
||||
public MainWindow(LibVLC libVLC, MediaPlayer mediaPlayer,
|
||||
IMediator mediator,
|
||||
FormState formState,
|
||||
Config config)
|
||||
Config config,
|
||||
HelpWindow helpWindow)
|
||||
{
|
||||
InitializeComponent();
|
||||
_libVLC = libVLC;
|
||||
@@ -37,6 +43,7 @@ public partial class MainWindow
|
||||
_mediator = mediator;
|
||||
_formState = formState;
|
||||
_config = config;
|
||||
_helpWindow = helpWindow;
|
||||
|
||||
VideoView.Loaded += VideoView_Loaded;
|
||||
Closed += OnFormClosed;
|
||||
@@ -64,6 +71,21 @@ public partial class MainWindow
|
||||
|
||||
if (LvFiles.Items.IsEmpty)
|
||||
BlinkHelp(HelpTexts.HelpTextsDict[HelpTextEnum.Initial]);
|
||||
|
||||
ShowHelpOnStart = _config.ShowHelpOnStart;
|
||||
if (ShowHelpOnStart)
|
||||
{
|
||||
_helpWindow.Show();
|
||||
_ = Task.Run(() =>
|
||||
{
|
||||
Task.Delay(300);
|
||||
Dispatcher.Invoke(() =>
|
||||
{
|
||||
_helpWindow.Activate();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void BlinkHelp(string helpText, int times = 3)
|
||||
@@ -169,7 +191,9 @@ public partial class MainWindow
|
||||
Annotations = files.ToDictionary(f => Path.GetFileNameWithoutExtension(f.Name), f =>
|
||||
{
|
||||
var str = File.ReadAllText(f.FullName);
|
||||
return str.Split(Environment.NewLine).Select(AnnotationInfo.Parse).ToList();
|
||||
return str.Split(Environment.NewLine).Select(AnnotationInfo.Parse)
|
||||
.Where(x => x != null)
|
||||
.ToList();
|
||||
})!;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user