Ошибка обнаружения простой формы сети AForge

Я пытаюсь написать простое приложение для определения формы. Я использую образец из библиотеки Aforge.net. Но я всегда получаю ту же ошибку:

невозможно преобразовать AForge.Point[] в System.Drawing.PointF[]

Я пытаюсь изменить некоторые вещи в методе ImageProcess, а также в ToPointsArray, но эффект всегда один и тот же. Что еще я могу попробовать? Что я делаю неправильно?

Вот код:

общедоступный частичный класс Form1: Form { public Form1() { InitializeComponent(); }

    private void button1_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            try
            {
                ProcessImage((Bitmap)Bitmap.FromFile(openFileDialog1.FileName));
            }
            catch
            {
                MessageBox.Show("Załadowanie obrazu niepowiodło się.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }

    private void ProcessImage(Bitmap bitmap)
    {
        //-------------------------------------

        BitmapData bitmapData = bitmap.LockBits(
            new Rectangle(0, 0, bitmap.Width, bitmap.Height),
            ImageLockMode.ReadWrite, bitmap.PixelFormat);

        //-------------------------------------

        ColorFiltering colorFilter = new ColorFiltering();

        colorFilter.Red = new IntRange(0, 64);
        colorFilter.Green = new IntRange(0, 64);
        colorFilter.Blue = new IntRange(0, 64);
        colorFilter.FillOutsideRange = false;

        colorFilter.ApplyInPlace(bitmapData);

        //-------------------------------------

        BlobCounter blobCounter = new BlobCounter();

        blobCounter.FilterBlobs = true;
        blobCounter.MinHeight = 5;
        blobCounter.MinWidth = 5;

        blobCounter.ProcessImage(bitmapData);
        Blob[] blobs = blobCounter.GetObjectsInformation();
        bitmap.UnlockBits(bitmapData);

        //-------------------------------------

        SimpleShapeChecker shapeChecker = new SimpleShapeChecker();

        Graphics g = Graphics.FromImage(bitmap);
        Pen redPen = new Pen(Color.Red, 2);       // quadrilateral
        Pen brownPen = new Pen(Color.Brown, 2);   // quadrilateral with known sub-type
        Pen greenPen = new Pen(Color.Green, 2);   // known triangle
        Pen bluePen = new Pen(Color.Blue, 2);     // triangle

        for (int i = 0, n = blobs.Length; i < n; i++)
        {
            List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]);

            {
                List<IntPoint> corners;

                // is triangle or quadrilateral
                if (shapeChecker.IsConvexPolygon(edgePoints, out corners))
                {
                    // get sub-type
                    PolygonSubType subType = shapeChecker.CheckPolygonSubType(corners);

                    Pen pen;

                    if (subType == PolygonSubType.Unknown)
                    {
                        pen = (corners.Count == 4) ? redPen : bluePen;
                    }
                    else
                    {
                        pen = (corners.Count == 4) ? brownPen : greenPen;
                    }

                    g.DrawPolygon(pen, ToPointsArray(corners));
                }
            }
        }

        redPen.Dispose();
        greenPen.Dispose();
        bluePen.Dispose();
        brownPen.Dispose();
        g.Dispose();

        // put new image to clipboard
        Clipboard.SetDataObject(bitmap);
        // and to picture box
        pictureBox1.Image = bitmap;

        UpdatePictureBoxPosition();
    }

    private Point[] ToPointsArray(List<IntPoint> points)
    {
        Point[] array = new Point[points.Count];

        for (int i = 0, n = points.Count; i < n; i++)
        {
            array[i] = new Point(points[i].X, points[i].Y);
        }

        return array;
    }

person Caladean    schedule 01.01.2015    source источник


Ответы (1)


Ваша проблема в том, что AForge имеет собственную структуру Point, поэтому ваш метод ToPointArray фактически возвращает массив точек Aforge, а не массив необходимой точки .net. Самое простое решение — полностью определить тип, который вы хотите использовать, чтобы ваш метод стал

private System.Drawing.Point[] ToPointsArray(List<IntPoint> points)
{
    System.Drawing.Point[] array = new System.Drawing.Point[points.Count];
    ...
}

В качестве альтернативы, если вы хотите сохранить несколько символов, вы можете создать псевдоним пространства имен с оператором using в верхней части класса.

using NetPoint = System.Drawing.Point;

private NetPoint  ToPointsArray(List<IntPoint> points)
{
    NetPoint array = new NetPoint[points.Count];
    ...
}

В качестве примечания этот метод можно было бы сократить, если бы linq был доступен для использования. Например,

private System.Drawing.Point[] ToPointsArray(List<IntPoint> points)
{
    return points.Select(p => new System.Drawing.Point(p.X, p.Y)).ToArray();
}
person Ash Burlaczenko    schedule 02.01.2015