using System.Collections.ObjectModel; using Microsoft.Extensions.Logging; using OpenCvSharp; using GSS2.Core.Extensions; namespace GSS2.Core.Analysis.AmineContent; public class ImageCapturerMockService : IImageCapturerService { // Список интенсивностей освещения для каждого кадра public static readonly ReadOnlyCollection<(double visible, double uv365, double uv254)> IlluminatorIntensities = [ (0.02500, 0.0, 0.0), (0.01250, 0.0, 0.0), (0.00625, 0.0, 0.0), (0.00000, 1.0, 0.0), (0.00000, 0.0, 1.0), (0.00000, 1.0, 1.0), (0.01250, 1.0, 0.0), (0.01250, 0.0, 1.0), (0.01250, 1.0, 1.0), (0.00625, 1.0, 0.0), (0.00625, 0.0, 1.0), (0.00625, 1.0, 1.0) ]; private readonly string _imagesDirectoryPath; private readonly ILogger _logger; public ImageCapturerMockService(string imagesDirectoryPath, ILogger logger) { _imagesDirectoryPath = imagesDirectoryPath; _logger = logger; } public async Task CaptureImages(Action<(int i, double visible, double uv365, double uv254, Mat image)> callback, CancellationToken cancellationToken) => await CaptureImages(async (data) => callback(data), cancellationToken); public async Task CaptureImages(Func<(int i, double visible, double uv365, double uv254, Mat image), Task> callback, CancellationToken cancellationToken) { foreach (var (i, (visible, uv365, uv254)) in IlluminatorIntensities.Enumerate()) { cancellationToken.ThrowIfCancellationRequested(); _logger.LogInformation("Capturing images: {} / {} ({};{};{})", i + 1, IlluminatorIntensities.Count(), visible, uv365, uv254); Mat? image = Cv2.ImRead(Path.Join(_imagesDirectoryPath, $"{visible}-{uv365}-{uv254}.png")); if (image is null) throw new Exception("Image capture failed"); await callback.Invoke((i, visible, uv365, uv254, image)); } } }