sliding window for vision builder image strip pannel
This commit is contained in:
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user