Files
HawkeyeVision/Plugins/CandyboxPlugin/Modules/CandyboxImageProcessingControl.cs
2025-09-16 10:42:43 +02:00

105 lines
3.2 KiB
C#

using CandyboxPlugin.Recipe;
using Hawkeye.VisionBuilder.UI.Sources.Hawkeye;
using Newtonsoft.Json;
using OpenCvSharp;
using Serilog;
using VisionBuilder.UI.Common.Processing;
using VisionBuilder.UI.Common.ViewModel.Classes;
namespace CandyboxPlugin.Module;
public class CandyboxImageProcessingControl : BaseRecognitionControl
{
private readonly IImageSource _imageSource;
private HistoRecipe _histoRecipe;
public CandyboxImageProcessingControl(CandyboxRecognitionControlSettings settings, IImageSource imageSource, ILoadingService loadingService) : base(settings, loadingService)
{
_imageSource = imageSource;
}
private const string RECIPES_DIR = @"..\Data\Recipes";
private const string SAMPLES_DIR = @"..\Data\Samples";
public override List<RecipeData> GetRecipesData()
{
var recipes = new List<RecipeData>();
var recipeFiles = Directory.GetFiles(RECIPES_DIR, "*.json");
foreach (var file in recipeFiles)
{
var name = Path.GetFileNameWithoutExtension(file);
Mat? image = null;
var filePatterns = new[]
{
name + ".bmp",
"r" + name + ".bmp",
name.Replace("recipe", "") + ".bmp"
};
foreach (var pattern in filePatterns)
{
var filePath = Path.Combine(SAMPLES_DIR, pattern);
if (File.Exists(filePath))
{
image = Cv2.ImRead(filePath);
break; // Exit loop after finding the first matching file
}
else
{
Log.Debug($"File not found: {filePath}");
}
}
recipes.Add(new RecipeData
{
RecipeName = name,
Image = image
});
}
return recipes;
}
protected override void Initialize(RecipeData currentRecipe)
{
_histoRecipe = new HistoRecipe(currentRecipe.RecipeName);
if (_imageSource is HawkeyeCameraImageSource hawkeye)
{
var settings = hawkeye.Settings;
settings.ImageSettings = settings.ImageSettings with {Lines = _histoRecipe.GetCameraWidth()};
hawkeye.ApplySettings(settings);
}
}
protected override void WarmUp()
{
}
protected override (Mat originalImage, Mat analysisImage, TimeSpan processingTime, TimeSpan acquisitionTime, string[] errorNames)?
ProcessImage(CancellationToken token)
{
var swTotal = System.Diagnostics.Stopwatch.StartNew();
var swAcquision = System.Diagnostics.Stopwatch.StartNew();
var image = _imageSource.GetImage(token).Result;
swAcquision.Stop();
if (image==null)
{
return null;
}
var res=_histoRecipe.ProcessImage(image);
swTotal.Stop();
var allErrors =
res.ErrorPoints.Select(x => x.ToString())
.Concat(
res.ErrorReason.Where(x=>x != EErrorReason.Good).Select(x=>x.ToString())
).ToArray();
return (image, res.ProcessedImage, swTotal.Elapsed, swAcquision.Elapsed, allErrors);
}
}