Files
HawkeyeVision/VisionBuilder.UI.Recipes.HawkeyeRecipe/HawkeyeRecognitionControl.cs
EugeneTes 2bac7140a4 2.0.14
2026-02-17 10:11:33 +01:00

118 lines
4.2 KiB
C#

using System.CodeDom;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using Hawkeye.VisionBuilder.Workflow;
using Hawkeye.VisionBuilder.Workflow.Datatypes;
using Hawkeye.VisionBuilder.Workflow.Operations;
using OpenCvSharp;
using Serilog;
using VisionBuilder.UI.Common.Commands;
using VisionBuilder.UI.Common.Processing;
using VisionBuilder.UI.Common.ViewModel.Classes;
namespace VisionBuilder.UI.Recipes.HawkeyeRecipe
{
public class HawkeyeRecognitionControl: BaseRecognitionControl
{
private readonly IImageSource _imageSource;
private readonly HawkeyeRecognitionSettings _recognitionConfiguration;
private CancellationTokenSource _cts;
private Task _loopTask;
public HawkeyeRecognitionControl(IImageSource imageSource, HawkeyeRecognitionSettings recognitionConfiguration, ILoadingService loadingService): base(recognitionConfiguration,loadingService)
{
_imageSource = imageSource;
_recognitionConfiguration = recognitionConfiguration;
}
public override List<RecipeData> GetRecipesData()
{
LoadingService.StartLoading($"Loading recipes for {_recognitionConfiguration.CameraName}...");
try
{
var files = WorkflowRecipeHelper.ListRecipeFiles(_recognitionConfiguration.RecipeNameFilter);
List<RecipeData> recipes = new List<RecipeData>();
foreach (var file in files)
{
var workFlow = WorkflowList.LoadJSONFromFile(file);
var recipe = new RecipeData
{
RecipeName = Path.GetFileNameWithoutExtension(file),
Image = workFlow.RecipeImage
};
recipes.Add(recipe);
}
return recipes;
}
finally
{
LoadingService.StopLoading($"Loading recipes for {_recognitionConfiguration.CameraName}...");
}
}
private WorkflowList _workflow;
protected override void Initialize(RecipeData currentRecipe)
{
_workflow = WorkflowList.LoadJSONFromFile("..\\Data\\Recipes\\" + currentRecipe.RecipeName + ".jhrcp");
}
protected override void WarmUp()
{
_workflow.ImageSource = new EmptyImageSource();
_workflow.Context = new Context();
_workflow.Context.CancellationToken = CancellationToken.None;
_workflow.Execute();
}
protected override (Mat originalImage, Mat analysisImage,TimeSpan processingTime, TimeSpan acquisitionTime, string[] errorNames)? ProcessImage(CancellationToken token)
{
var sw = Stopwatch.StartNew();
_workflow.Context.CancellationToken = token;
_workflow.ImageSource = _imageSource;
try
{
_workflow.Execute();
}
catch (Exception e) when (token.IsCancellationRequested)
{
sw.Stop();
return null;
}
sw.Stop();
var annotated = _workflow.Context.ActiveImage.ImageData.Clone();
var canvas = new OpenCVCanvas(annotated);
_workflow.Context.GraphicsElements.ForEach(x => x.Draw(canvas));
var originalImage = _workflow.Context.LastCameraImage.ImageData;
var analysisImage = annotated;
var cameraOperation = _workflow.Operations.FirstOrDefault(x => x is GetImageOperation);
TimeSpan cameraTime = TimeSpan.FromMilliseconds(0);
if (cameraOperation != null)
{
cameraTime = cameraOperation.ExecutionTime;
}
string[] errorNames = _workflow.Operations.Where(x => !x.Result).Select(x => x.Label).ToArray();
if (_recognitionConfiguration.AlwaysError)
{
errorNames = errorNames.Concat(new[] { "Forced error" }).ToArray();
}
return (originalImage, analysisImage, sw.Elapsed, cameraTime, errorNames);
}
}
}