sliding window for vision builder image strip pannel

This commit is contained in:
meelstorm
2025-11-14 10:26:43 +01:00
parent 0ee132788d
commit e5eaa88e51
7 changed files with 1090 additions and 193 deletions

View File

@@ -1,4 +1,5 @@
using System.Drawing.Drawing2D;
using Hawkeye.VisionBuilder.Workflow.Datatypes;
using OpenCvSharp;
using OpenCvSharp.Extensions;
using VisionBuilder.UI.Common.Processing;
@@ -8,35 +9,51 @@ namespace Hawkeye.VisionBuilder.Features.ImagesStrip
{
public partial class ImageStripPanel : Form, IImageSource
{
public ImagesViewModel ImagesViewModel { get; set; }
public ImageStripPanel()
{
InitializeComponent();
listView1.SelectedIndexChanged += ListView1_SelectedIndexChanged;
ImagesViewModel = new ImagesViewModel(20);
//ImagesViewModel.CurrentImageChanged += ImagesViewModel_CurrentImageChanged;
//ImagesViewModel.ImagesAdded += ImagesViewModel_ImageAdded;
//ImagesViewModel.ImagesRemoved += ImagesViewModel_ImageRemoved;
virtualizedImageList1.ViewModel=ImagesViewModel;
virtualizedImageList1.ImageSelected += VirtualizedImageList1_ImageSelected;
}
private void ListView1_SelectedIndexChanged(object? sender, EventArgs e)
private void VirtualizedImageList1_ImageSelected(object? sender, string e)
{
if (listView1.SelectedItems.Count > 0)
{
lblSelectedImage.Text = $"{listView1.SelectedIndices[0] + 1}/{listView1.Items.Count}";
var path = (string)listView1.SelectedItems[0].Tag;
listView1.SelectedItems[0].ImageKey = path;
var img = new Mat(path);
var image = new Workflow.Datatypes.HawkeyeImage()
{
Filename = path,
ImageData = img
};
listView1.LargeImageList.Images.RemoveByKey(path);
listView1.LargeImageList.Images.Add(path, img.Resize(new OpenCvSharp.Size(108, 108)).ToBitmap());
ImageSelected(image);
}
lblSelectedImage.Text = $"{this.ImagesViewModel.CurrentIndex + 1}/{ImagesViewModel.TotalCount}";
ImageSelected(new HawkeyeImage() { Filename = ImagesViewModel.CurrentImagePath, ImageData = new Mat(ImagesViewModel.CurrentImagePath) });
}
//private void ImagesViewModel_CurrentImageChanged(object? sender, CurrentImageChangedEventArgs e)
//{
// var path = e.NewImagePath;
// for (int i = 0; i < listView1.Items.Count; i++)
// {
// var item = listView1.Items[i];
// var itemPath = (string)item.ImageKey;
// if (itemPath == path)
// {
// SetSelectedImage(i);
// ImageSelected(new HawkeyeImage(){Filename = ImagesViewModel.CurrentImagePath, ImageData = new Mat(ImagesViewModel.CurrentImagePath)});
// break;
// }
// }
//}
public bool IsExecutingWorkflow
{
get => ckbExecuteWorkflow.Checked;
@@ -44,145 +61,53 @@ namespace Hawkeye.VisionBuilder.Features.ImagesStrip
}
public event Action<Workflow.Datatypes.HawkeyeImage> ImageSelected = delegate { };
public void LoadImage(Mat image)
{
ImageList imageList = new ImageList();
imageList.ImageSize = new Size(108, 108);
listView1.LargeImageList = imageList;
listView1.Items.Clear();
imageList.Images.Add("image", image.ToBitmap());
var item = listView1.Items.Add("image");
item.Tag = new Workflow.Datatypes.HawkeyeImage()
{
Filename = "image",
ImageData = image
};
item.Text = "";
item.ImageKey = "image";
listView1.SelectedIndices.Clear();
listView1.SelectedIndices.Add(0);
}
public Bitmap FitImage(Image image, int targetWidth, int targetHeight)
{
var aspectRatio = (float)image.Width / image.Height;
int width;
int height;
if ((float)targetWidth / targetHeight > aspectRatio)
{
width = (int)(targetHeight * aspectRatio);
height = targetHeight;
}
else
{
width = targetWidth;
height = (int)(targetWidth / aspectRatio);
}
Bitmap bitmap = new Bitmap(targetWidth, targetHeight);
using (Graphics graphics = Graphics.FromImage(bitmap))
{
graphics.DrawImage(image, new Rectangle(0, 0, width, height));
return bitmap;
}
}
public void LoadImages(string directory)
{
listView1.BeginUpdate();
ImageList imageList = new ImageList();
imageList.ImageSize = new Size(108, 108);
listView1.LargeImageList = imageList;
listView1.Items.Clear();
var mock = new Bitmap(108, 108);
using (Graphics g = Graphics.FromImage(mock))
{
var brush = new HatchBrush(HatchStyle.Percent50, Color.LightGray, Color.Transparent);
g.FillRectangle(brush, 0, 0, 108, 108);
g.DrawString("Not loaded", new Font("Arial", 12), Brushes.Gray, new PointF(0, 0));
}
var allImages = Directory.GetFiles(directory, "*.bmp", SearchOption.AllDirectories)
.Concat(Directory.GetFiles(directory, "*.png", SearchOption.AllDirectories))
.Concat(Directory.GetFiles(directory, "*.jpg", SearchOption.AllDirectories))
.Where(x => !Path.GetFileNameWithoutExtension(x).Contains("_analysis"))
//.Select(x=>new {path=x,bmp = new Bitmap(x)})
.Select(x => new { path = x, bmp = mock })
.ToArray();
imageList.Images.Add("none", mock);
foreach (var image in allImages)
{
var item = listView1.Items.Add(image.path);
item.Text = "";
item.Tag = image.path;
item.ImageKey = "none";
}
if (listView1.Items.Count > 0)
{
listView1.SelectedIndices.Clear();
listView1.SelectedIndices.Add(0);
toolStrip1.Enabled = true;
}
else
{
toolStrip1.Enabled = false;
}
listView1.EndUpdate();
//listView1.BeginUpdate();
ImagesViewModel.LoadFromDirectory(directory);
//listView1.EndUpdate();
}
private void btnToStart_Click(object sender, EventArgs e)
{
listView1.SelectedIndices.Clear();
listView1.SelectedIndices.Add(0);
listView1.EnsureVisible(listView1.SelectedIndices[0]);
ImagesViewModel.First();
}
public void Prev()
{
btnPrev_Click(null, null);
ImagesViewModel.Previous();
}
private void btnPrev_Click(object sender, EventArgs e)
{
if (listView1.SelectedIndices.Count == 0) return;
var index = listView1.SelectedIndices[0];
index--;
if (index < 0) index++;
listView1.SelectedIndices.Clear();
listView1.SelectedIndices.Add(index);
listView1.EnsureVisible(listView1.SelectedIndices[0]);
Prev();
}
public void Next()
{
btnNext_Click(null, null);
ImagesViewModel.Next();
}
private void btnNext_Click(object sender, EventArgs e)
{
if (listView1.SelectedIndices.Count == 0) return;
var index = listView1.SelectedIndices[0];
index++;
if (index > listView1.Items.Count - 1) index--;
listView1.SelectedIndices.Clear();
listView1.SelectedIndices.Add(index);
listView1.EnsureVisible(listView1.SelectedIndices[0]);
Next();
}
private void btnToEnd_Click(object sender, EventArgs e)
{
listView1.SelectedIndices.Clear();
listView1.SelectedIndices.Add(listView1.Items.Count - 1);
listView1.EnsureVisible(listView1.SelectedIndices[0]);
ImagesViewModel.Last();
}
private void btnPlay_Click(object sender, EventArgs e)
{
Task.Run(Playback);
@@ -194,14 +119,17 @@ namespace Hawkeye.VisionBuilder.Features.ImagesStrip
{
Action a = () =>
{
if (listView1.SelectedIndices.Count == 0) return;
var index = listView1.SelectedIndices[0];
index++;
if (index > listView1.Items.Count - 1)
if (ImagesViewModel.TotalCount == 0)
{
btnPlay.Checked = false;
return;
}
if (ImagesViewModel.CurrentIndex > ImagesViewModel.TotalCount - 1)
{
if (cbRepeat.Checked)
{
index = 0;
ImagesViewModel.First();
}
else
{
@@ -210,19 +138,14 @@ namespace Hawkeye.VisionBuilder.Features.ImagesStrip
}
}
listView1.SelectedIndices.Clear();
listView1.SelectedIndices.Add(index);
listView1.EnsureVisible(listView1.SelectedIndices[0]);
Next();
};
listView1.Invoke(a);
virtualizedImageList1.Invoke(a);
virtualizedImageList1.Invalidate();
await Task.Delay(int.Parse((string)ncInterval.Text));
}
}
public string GetName()
{
return "ImageStripPanel";
}
public Task<Mat> GetImage(CancellationToken token)
{
@@ -231,19 +154,13 @@ namespace Hawkeye.VisionBuilder.Features.ImagesStrip
public Mat GetImage()
{
if (listView1.SelectedIndices.Count == 0) return null;
var path = listView1.SelectedItems[0].ImageKey;
return new Mat(path);
return new Mat(ImagesViewModel.CurrentImagePath);
}
public string GetImagePath()
{
if (listView1.SelectedIndices.Count == 0) return null;
var path = listView1.SelectedItems[0].Tag as string;
if (path == null) return null;
return path;
return ImagesViewModel.CurrentImagePath;
}
public bool StopOnErrors
@@ -277,42 +194,11 @@ namespace Hawkeye.VisionBuilder.Features.ImagesStrip
}
}
public void RemoveImage(Workflow.Datatypes.HawkeyeImage currentImage)
{
if (listView1.SelectedIndices.Count == 0) return;
var index = listView1.SelectedIndices[0];
listView1.Items.RemoveAt(index);
if (listView1.Items.Count > 0)
{
if (index > listView1.Items.Count - 1) index--;
listView1.SelectedIndices.Clear();
listView1.SelectedIndices.Add(index);
listView1.EnsureVisible(listView1.SelectedIndices[0]);
}
}
public List<string> GetFileList()
{
return listView1.Items.Cast<ListViewItem>().Select(x => (string)x.Tag).ToList();
}
public void ReSelect()
{
if(listView1.SelectedIndices.Count == 0) return;
var index = listView1.SelectedIndices[0];
listView1.SelectedIndices.Clear();
listView1.SelectedIndices.Add(index);
listView1.EnsureVisible(listView1.SelectedIndices[0]);
}
public void SelectImage(string nextFile)
{
var index = listView1.Items.Cast<ListViewItem>().Where(x => (string)x.Tag == nextFile).Select(x => x.Index).FirstOrDefault();
if (index == -1) return;
listView1.SelectedIndices.Clear();
listView1.SelectedIndices.Add(index);
listView1.EnsureVisible(listView1.SelectedIndices[0]);
ImagesViewModel.SelectByPath(nextFile);
}
}