mirror of
https://github.com/azaion/annotations.git
synced 2026-04-22 23:26:30 +00:00
move Windows app to Windows folder, create folder for Web, create simplest web api service
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
using MediatR;
|
||||
|
||||
namespace Azaion.Annotator.DTO;
|
||||
|
||||
public class AnnClassSelectedEvent(AnnotationClass annotationClass) : INotification
|
||||
{
|
||||
public AnnotationClass AnnotationClass { get; } = annotationClass;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using System.Windows.Media;
|
||||
using Azaion.Annotator.Extensions;
|
||||
|
||||
namespace Azaion.Annotator.DTO;
|
||||
|
||||
public class AnnotationClass(int id, string name = "")
|
||||
{
|
||||
public int Id { get; set; } = id;
|
||||
|
||||
public string Name { get; set; } = name;
|
||||
public Color Color { get; set; } = id.ToColor();
|
||||
|
||||
public int ClassNumber => Id + 1;
|
||||
public SolidColorBrush ColorBrush => new(Color);
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
using System.Globalization;
|
||||
using System.Windows;
|
||||
|
||||
namespace Azaion.Annotator.DTO;
|
||||
|
||||
public class AnnotationInfo
|
||||
{
|
||||
public int ClassNumber { get; set; }
|
||||
public double X { get; set; }
|
||||
public double Y { get; set; }
|
||||
public double Width { get; set; }
|
||||
public double Height { get; set; }
|
||||
|
||||
public AnnotationInfo() { }
|
||||
public AnnotationInfo(int classNumber, double x, double y, double width, double height)
|
||||
{
|
||||
ClassNumber = classNumber;
|
||||
X = x;
|
||||
Y = y;
|
||||
Width = width;
|
||||
Height = height;
|
||||
}
|
||||
|
||||
public override string ToString() => $"{ClassNumber} {X:F5} {Y:F5} {Width:F5} {Height:F5}".Replace(',', '.');
|
||||
|
||||
public AnnotationInfo ToLabelCoordinates(Size canvasSize, Size videoSize)
|
||||
{
|
||||
var cw = canvasSize.Width;
|
||||
var ch = canvasSize.Height;
|
||||
var canvasAR = cw / ch;
|
||||
var videoAR = videoSize.Width / videoSize.Height;
|
||||
|
||||
var annInfo = new AnnotationInfo { ClassNumber = this.ClassNumber };
|
||||
double left, top;
|
||||
if (videoAR > canvasAR) //100% width
|
||||
{
|
||||
left = X / cw;
|
||||
annInfo.Width = Width / cw;
|
||||
var realHeight = cw / videoAR; //real video height in pixels on canvas
|
||||
var blackStripHeight = (ch - realHeight) / 2.0; //height of black strips at the top and bottom
|
||||
top = (Y - blackStripHeight) / realHeight;
|
||||
annInfo.Height = Height / realHeight;
|
||||
}
|
||||
else //100% height
|
||||
{
|
||||
top = Y / ch;
|
||||
annInfo.Height = Height / ch;
|
||||
var realWidth = ch * videoAR; //real video width in pixels on canvas
|
||||
var blackStripWidth = (cw - realWidth) / 2.0; //height of black strips at the top and bottom
|
||||
left = (X - blackStripWidth) / realWidth;
|
||||
annInfo.Width = Width / realWidth;
|
||||
}
|
||||
|
||||
annInfo.X = left + annInfo.Width / 2.0;
|
||||
annInfo.Y = top + annInfo.Height / 2.0;
|
||||
|
||||
return annInfo;
|
||||
}
|
||||
|
||||
public AnnotationInfo ToCanvasCoordinates(Size canvasSize, Size videoSize)
|
||||
{
|
||||
var cw = canvasSize.Width;
|
||||
var ch = canvasSize.Height;
|
||||
var canvasAR = cw / ch;
|
||||
var videoAR = videoSize.Width / videoSize.Height;
|
||||
|
||||
var annInfo = new AnnotationInfo { ClassNumber = this.ClassNumber };
|
||||
|
||||
double left = X - Width / 2;
|
||||
double top = Y - Height / 2;
|
||||
|
||||
if (videoAR > canvasAR) //100% width
|
||||
{
|
||||
var realHeight = cw / videoAR; //real video height in pixels on canvas
|
||||
var blackStripHeight = (ch - realHeight) / 2.0; //height of black strips at the top and bottom
|
||||
|
||||
annInfo.X = left * cw;
|
||||
annInfo.Y = top * realHeight + blackStripHeight;
|
||||
annInfo.Width = Width * cw;
|
||||
annInfo.Height = Height * realHeight;
|
||||
}
|
||||
else //100% height
|
||||
{
|
||||
var realWidth = ch * videoAR; //real video width in pixels on canvas
|
||||
var blackStripWidth = (cw - realWidth) / 2.0; //height of black strips at the top and bottom
|
||||
|
||||
annInfo.X = left * realWidth + blackStripWidth;
|
||||
annInfo.Y = top * ch;
|
||||
annInfo.Width = Width * realWidth;
|
||||
annInfo.Height = Height * ch;
|
||||
}
|
||||
return annInfo;
|
||||
}
|
||||
|
||||
public static AnnotationInfo? Parse(string? s)
|
||||
{
|
||||
if (s == null || string.IsNullOrEmpty(s))
|
||||
return null;
|
||||
|
||||
var strs = s.Replace(',','.').Split(' ');
|
||||
if (strs.Length != 5)
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
var res = new AnnotationInfo
|
||||
{
|
||||
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)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using Newtonsoft.Json;
|
||||
using Size = System.Windows.Size;
|
||||
using Point = System.Windows.Point;
|
||||
|
||||
namespace Azaion.Annotator.DTO;
|
||||
|
||||
public class Config
|
||||
{
|
||||
private const string CONFIG_PATH = "config.json";
|
||||
private const string DEFAULT_VIDEO_DIR = "video";
|
||||
private const string DEFAULT_LABELS_DIR = "labels";
|
||||
private const string DEFAULT_IMAGES_DIR = "images";
|
||||
private static readonly Size DefaultWindowSize = new(1280, 720);
|
||||
private static readonly Point DefaultWindowLocation = new(100, 100);
|
||||
|
||||
|
||||
public string VideosDirectory { get; set; } = DEFAULT_VIDEO_DIR;
|
||||
public string LabelsDirectory { get; set; } = DEFAULT_LABELS_DIR;
|
||||
public string ImagesDirectory { get; set; } = DEFAULT_IMAGES_DIR;
|
||||
|
||||
public List<AnnotationClass> AnnotationClasses { get; set; } = [];
|
||||
public Size WindowSize { get; set; }
|
||||
public Point WindowLocation { get; set; }
|
||||
public bool ShowHelpOnStart { get; set; }
|
||||
|
||||
public void Save()
|
||||
{
|
||||
File.WriteAllText(CONFIG_PATH, JsonConvert.SerializeObject(this, Formatting.Indented), Encoding.UTF8);
|
||||
}
|
||||
|
||||
public static Config Read()
|
||||
{
|
||||
string configFilePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), CONFIG_PATH);
|
||||
|
||||
if (!File.Exists(configFilePath))
|
||||
{
|
||||
var exePath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory)!;
|
||||
return new Config
|
||||
{
|
||||
VideosDirectory = Path.Combine(exePath, DEFAULT_VIDEO_DIR),
|
||||
LabelsDirectory = Path.Combine(exePath, DEFAULT_LABELS_DIR),
|
||||
ImagesDirectory = Path.Combine(exePath, DEFAULT_IMAGES_DIR),
|
||||
WindowLocation = DefaultWindowLocation,
|
||||
WindowSize = DefaultWindowSize,
|
||||
ShowHelpOnStart = true
|
||||
};
|
||||
}
|
||||
try
|
||||
{
|
||||
var str = File.ReadAllText(CONFIG_PATH);
|
||||
return JsonConvert.DeserializeObject<Config>(str) ?? new Config();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return new Config();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
|
||||
namespace Azaion.Annotator.DTO;
|
||||
|
||||
public class FormState
|
||||
{
|
||||
public SelectionState SelectionState { get; set; } = SelectionState.None;
|
||||
|
||||
public string CurrentFile { get; set; } = null!;
|
||||
public Size CurrentVideoSize { get; set; }
|
||||
public string VideoName => Path.GetFileNameWithoutExtension(CurrentFile).Replace(" ", "");
|
||||
public TimeSpan CurrentVideoLength { get; set; }
|
||||
public int CurrentVolume { get; set; } = 100;
|
||||
|
||||
public string GetTimeName(TimeSpan ts) => $"{VideoName}_{ts:hmmssf}";
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using System.Windows.Input;
|
||||
using MediatR;
|
||||
|
||||
namespace Azaion.Annotator.DTO;
|
||||
|
||||
public class KeyEvent(object sender, KeyEventArgs args) : INotification
|
||||
{
|
||||
public object Sender { get; set; } = sender;
|
||||
public KeyEventArgs Args { get; set; } = args;
|
||||
}
|
||||
|
||||
public class PlaybackControlEvent(PlaybackControlEnum playbackControlEnum) : INotification
|
||||
{
|
||||
public PlaybackControlEnum PlaybackControl { get; set; } = playbackControlEnum;
|
||||
}
|
||||
|
||||
public class VolumeChangedEvent(int volume) : INotification
|
||||
{
|
||||
public int Volume { get; set; } = volume;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
namespace Azaion.Annotator.DTO;
|
||||
|
||||
public enum PlaybackControlEnum
|
||||
{
|
||||
None = 0,
|
||||
Play = 1,
|
||||
Pause = 2,
|
||||
Stop = 3,
|
||||
PreviousFrame = 4,
|
||||
NextFrame = 5,
|
||||
SaveAnnotations = 6,
|
||||
RemoveSelectedAnns = 7,
|
||||
RemoveAllAnns = 8,
|
||||
TurnOffVolume = 9,
|
||||
TurnOnVolume = 10
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace Azaion.Annotator.DTO;
|
||||
|
||||
public enum SelectionState
|
||||
{
|
||||
None = 0,
|
||||
NewAnnCreating = 1,
|
||||
AnnResizing = 2,
|
||||
AnnMoving = 3
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace Azaion.Annotator.DTO;
|
||||
|
||||
public class VideoFileInfo
|
||||
{
|
||||
public string Name { get; set; } = null!;
|
||||
public string Path { get; set; } = null!;
|
||||
public TimeSpan Duration { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user