Files
HawkeyeVision/Hawkeye.VisionBuilder.Workflow/Operations/AI/ArrayModelSamplerOperation.cs
2025-07-14 12:03:59 +02:00

87 lines
2.3 KiB
C#

using Hawkeye.VisionBuilder.Workflow.Datatypes.Elements.ArrayHorizontal;
using Hawkeye.VisionBuilder.Workflow.Operations.Attributes;
using OpenCvSharp;
using System.Runtime.InteropServices;
using Hawkeye.VisionBuilder.Workflow.Datatypes.Elements.Rectangle;
namespace Hawkeye.VisionBuilder.Workflow.Operations.AI;
[Category("AI")]
[IgnoreOperation]
public class ArrayModelSamplerOperation:BaseOperation
{
private Mat _lastImage;
public RectangleElement SearchArea { get; set; }
public string SampleStorage { get; set; } = "samples.storage";
public Action Sample { get; set; }
public ArrayModelSamplerOperation()
{
SearchArea = new RectangleElement()
{
Editable = true,
Location = Vector2.One * 100,
Size = new Vector2(100, 100),
};
Sample = SaveSample;
}
byte[] MatToBytes(Mat mat)
{
if (mat.Channels() == 3)
{
mat = mat.CvtColor(ColorConversionCodes.BGR2RGB);
}
IntPtr dataPtr = mat.Data;
int dataSize = mat.Rows * mat.Cols * mat.ElemSize();
byte[] byteArray = new byte[dataSize];
Marshal.Copy(dataPtr, byteArray, 0, dataSize);
return byteArray;
}
private void SaveSample()
{
Mat mask = new Mat(_lastImage.Size(), MatType.CV_8UC1, Scalar.Black);
SearchArea.FillMat(mask);
var imageBytes = MatToBytes(_lastImage);
var maskBytes = MatToBytes(mask);
// Append to the end of storage file
var storagePath=Path.Combine("..\\Data\\AI", SampleStorage);
using (var file = new System.IO.FileStream(storagePath, System.IO.FileMode.Append))
{
// Write size
file.Write(BitConverter.GetBytes(_lastImage.Width), 0, 4);
file.Write(BitConverter.GetBytes(_lastImage.Height), 0, 4);
file.Write(imageBytes, 0, imageBytes.Length);
// Write mask
file.Write(maskBytes, 0, maskBytes.Length);
}
}
protected override void InterpretInternal(Context context)
{
if (!CheckImageExists(context)) return;
if(!CheckColorful(context)) return;
context.GraphicsElements.Add(SearchArea);
_lastImage=context.ActiveImage.ImageData;
Result = true;
}
}