mirror of
https://github.com/azaion/annotations.git
synced 2026-04-22 22:06:30 +00:00
144 lines
5.4 KiB
C#
144 lines
5.4 KiB
C#
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media;
|
|
using System.Windows.Shapes;
|
|
using Azaion.Common.DTO;
|
|
using Azaion.Common.Extensions;
|
|
using Label = System.Windows.Controls.Label;
|
|
|
|
namespace Azaion.Common.Controls;
|
|
|
|
public class DetectionControl : Border
|
|
{
|
|
private readonly Action<object, MouseButtonEventArgs> _resizeStart;
|
|
private const double RESIZE_RECT_SIZE = 12;
|
|
|
|
private readonly Grid _grid;
|
|
private readonly Label _detectionLabel;
|
|
public TimeSpan Time { get; set; }
|
|
private readonly double _confidence;
|
|
private List<Rectangle> _resizedRectangles = new();
|
|
|
|
private DetectionClass _detectionClass = null!;
|
|
public DetectionClass DetectionClass
|
|
{
|
|
get => _detectionClass;
|
|
set
|
|
{
|
|
var brush = new SolidColorBrush(value.Color.ToConfidenceColor());
|
|
BorderBrush = brush;
|
|
BorderThickness = new Thickness(3);
|
|
foreach (var rect in _resizedRectangles)
|
|
rect.Stroke = brush;
|
|
|
|
_detectionLabel.Background = new SolidColorBrush(value.Color.ToConfidenceColor(_confidence));
|
|
_detectionLabel.Content = _detectionLabelText(value.UIName);
|
|
_detectionClass = value;
|
|
}
|
|
}
|
|
|
|
private readonly Rectangle _selectionFrame;
|
|
|
|
private bool _isSelected;
|
|
public bool IsSelected
|
|
{
|
|
get => _isSelected;
|
|
set
|
|
{
|
|
_selectionFrame.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
|
|
_isSelected = value;
|
|
}
|
|
}
|
|
|
|
private string _detectionLabelText(string detectionClassName) =>
|
|
_confidence >= 0.995 ? detectionClassName : $"{detectionClassName}: {_confidence * 100:F0}%"; //double
|
|
|
|
public DetectionControl(DetectionClass detectionClass, TimeSpan time, Action<object, MouseButtonEventArgs> resizeStart, CanvasLabel canvasLabel)
|
|
{
|
|
Width = canvasLabel.Width;
|
|
Height = canvasLabel.Height;
|
|
Time = time;
|
|
_resizeStart = resizeStart;
|
|
_confidence = canvasLabel.Confidence;
|
|
|
|
var labelContainer = new Canvas
|
|
{
|
|
HorizontalAlignment = HorizontalAlignment.Right,
|
|
VerticalAlignment = VerticalAlignment.Top,
|
|
ClipToBounds = false,
|
|
Margin = new Thickness(0, 0, 32, 0)
|
|
};
|
|
_detectionLabel = new Label
|
|
{
|
|
Content = _detectionLabelText(detectionClass.Name),
|
|
HorizontalAlignment = HorizontalAlignment.Right,
|
|
VerticalAlignment = VerticalAlignment.Top,
|
|
Margin = new Thickness(0, -32, 0, 0),
|
|
FontSize = 16,
|
|
Visibility = Visibility.Visible
|
|
};
|
|
labelContainer.Children.Add(_detectionLabel);
|
|
|
|
_selectionFrame = new Rectangle
|
|
{
|
|
HorizontalAlignment = HorizontalAlignment.Stretch,
|
|
VerticalAlignment = VerticalAlignment.Stretch,
|
|
Stroke = new SolidColorBrush(Colors.Black),
|
|
StrokeThickness = 2,
|
|
Visibility = Visibility.Collapsed
|
|
};
|
|
_resizedRectangles =
|
|
[
|
|
CreateResizeRect("rLT", HorizontalAlignment.Left, VerticalAlignment.Top, Cursors.SizeNWSE),
|
|
CreateResizeRect("rCT", HorizontalAlignment.Center, VerticalAlignment.Top, Cursors.SizeNS),
|
|
CreateResizeRect("rRT", HorizontalAlignment.Right, VerticalAlignment.Top, Cursors.SizeNESW),
|
|
CreateResizeRect("rLC", HorizontalAlignment.Left, VerticalAlignment.Center, Cursors.SizeWE),
|
|
CreateResizeRect("rRC", HorizontalAlignment.Right, VerticalAlignment.Center, Cursors.SizeWE),
|
|
CreateResizeRect("rLB", HorizontalAlignment.Left, VerticalAlignment.Bottom, Cursors.SizeNESW),
|
|
CreateResizeRect("rCB", HorizontalAlignment.Center, VerticalAlignment.Bottom, Cursors.SizeNS),
|
|
CreateResizeRect("rRB", HorizontalAlignment.Right, VerticalAlignment.Bottom, Cursors.SizeNWSE)
|
|
];
|
|
_grid = new Grid
|
|
{
|
|
Background = Brushes.Transparent,
|
|
HorizontalAlignment = HorizontalAlignment.Stretch,
|
|
VerticalAlignment = VerticalAlignment.Stretch,
|
|
Children = { _selectionFrame }
|
|
};
|
|
foreach (var rect in _resizedRectangles)
|
|
_grid.Children.Add(rect);
|
|
_grid.Children.Add(labelContainer);
|
|
|
|
Child = _grid;
|
|
Cursor = Cursors.SizeAll;
|
|
DetectionClass = detectionClass;
|
|
}
|
|
|
|
//small corners
|
|
private Rectangle CreateResizeRect(string name, HorizontalAlignment ha, VerticalAlignment va, Cursor crs)
|
|
{
|
|
var rect = new Rectangle() // small rectangles at the corners and sides
|
|
{
|
|
ClipToBounds = false,
|
|
Margin = new Thickness(-RESIZE_RECT_SIZE * 0.7),
|
|
HorizontalAlignment = ha,
|
|
VerticalAlignment = va,
|
|
Width = RESIZE_RECT_SIZE,
|
|
Height = RESIZE_RECT_SIZE,
|
|
Stroke = new SolidColorBrush(Color.FromArgb(230, 20, 20, 20)), // small rectangles color
|
|
Fill = new SolidColorBrush(Color.FromArgb(150, 80, 80, 80)),
|
|
Cursor = crs,
|
|
Name = name,
|
|
};
|
|
rect.MouseDown += (sender, args) => _resizeStart(sender, args);
|
|
return rect;
|
|
}
|
|
|
|
public YoloLabel GetLabel(Size canvasSize, Size? videoSize = null)
|
|
{
|
|
var label = new CanvasLabel(DetectionClass.YoloId, Canvas.GetLeft(this), Canvas.GetTop(this), Width, Height);
|
|
return new YoloLabel(label, canvasSize, videoSize);
|
|
}
|
|
}
|