120 lines
4.0 KiB
C#
120 lines
4.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using Inspectron.Hawkeye.Vision.Geometry;
|
|
using OpenCvSharp;
|
|
using OpenCvSharp.Extensions;
|
|
using Point = System.Drawing.Point;
|
|
|
|
|
|
namespace Lindt.Candybox.Demo
|
|
{
|
|
public partial class MaskControl : UserControl
|
|
{
|
|
private Bitmap _backBuffer;
|
|
private GrahamConvexHull _hull;
|
|
|
|
public MaskControl()
|
|
{
|
|
InitializeComponent();
|
|
_backBuffer = new Bitmap(1800, 1408);
|
|
_hull = new GrahamConvexHull();
|
|
}
|
|
|
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|
public Bitmap Mask { get; set; } = new Bitmap(1800, 1408);
|
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|
public Bitmap Original { get; set; } = new Bitmap(1800, 1408);
|
|
|
|
protected override void OnPaintBackground(PaintEventArgs e)
|
|
{
|
|
//base.OnPaintBackground(e);
|
|
}
|
|
|
|
private bool _isDown = false;
|
|
private Point _lastMouse;
|
|
|
|
|
|
protected override void OnMouseDown(MouseEventArgs e)
|
|
{
|
|
_isDown = true;
|
|
_lastMouse = ConvertCoordinates(new Point(e.X, e.Y));
|
|
}
|
|
|
|
protected override void OnMouseUp(MouseEventArgs e)
|
|
{
|
|
_isDown = false;
|
|
}
|
|
|
|
private Pen _pen = new Pen(Color.White, 30);
|
|
private Pen _penBlack = new Pen(Color.Black, 30);
|
|
protected override void OnMouseMove(MouseEventArgs e)
|
|
{
|
|
|
|
if (_isDown&&e.Button==MouseButtons.Left)
|
|
{
|
|
var curPoint = ConvertCoordinates(new Point(e.X, e.Y));
|
|
using (Graphics g = Graphics.FromImage(Mask))
|
|
{
|
|
g.DrawLine(_pen, curPoint.X, curPoint.Y,_lastMouse.X,_lastMouse.Y);
|
|
g.FillEllipse(Brushes.White, _lastMouse.X - 15, _lastMouse.Y - 15, 30,30);
|
|
}
|
|
}
|
|
if (_isDown && e.Button == MouseButtons.Right)
|
|
{
|
|
var curPoint = ConvertCoordinates(new Point(e.X, e.Y));
|
|
using (Graphics g = Graphics.FromImage(Mask))
|
|
{
|
|
g.DrawLine(_penBlack, curPoint.X, curPoint.Y, _lastMouse.X, _lastMouse.Y);
|
|
g.FillEllipse(Brushes.Black, _lastMouse.X - 15, _lastMouse.Y - 15, 30, 30);
|
|
}
|
|
}
|
|
_lastMouse = ConvertCoordinates(new Point(e.X, e.Y));
|
|
Invalidate();
|
|
}
|
|
|
|
private Pen _contourPen = new Pen(Color.GreenYellow, 3);
|
|
protected override void OnPaint(PaintEventArgs e)
|
|
{
|
|
var mat = Mask.ToMat().CvtColor(ColorConversionCodes.BGR2GRAY);
|
|
var contours = mat.FindContoursAsArray(RetrievalModes.External, ContourApproximationModes.ApproxNone);
|
|
LastContours = contours;
|
|
using (Graphics g = Graphics.FromImage(_backBuffer))
|
|
{
|
|
g.DrawImage(Original, 0, 0);
|
|
|
|
for (int i = 0; i < contours.Length; i++)
|
|
{
|
|
if (contours[i].Length > 1)
|
|
{
|
|
var points = contours[i].Select(x => new System.Drawing.Point(x.X, x.Y)).ToArray();
|
|
g.DrawPolygon(_contourPen, points);
|
|
}
|
|
}
|
|
g.DrawEllipse(Pens.Gray,_lastMouse.X-15, _lastMouse.Y - 15,30,30);
|
|
}
|
|
e.Graphics.DrawImage(_backBuffer,0, 0,Width,Height);
|
|
}
|
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|
public OpenCvSharp.Point[][] LastContours { get; set; }
|
|
|
|
Point ConvertCoordinates(Point coords)
|
|
{
|
|
return new Point(coords.X * 2, coords.Y * 2);
|
|
}
|
|
|
|
protected override void OnResize(EventArgs e)
|
|
{
|
|
base.OnResize(e);
|
|
|
|
}
|
|
}
|
|
}
|