AForge net简单形状检测错误

AForge net simple shape detection error

我尝试编写简单的形状检测应用程序。我正在使用 Aforge.net 库中的示例。但我总是得到同样的错误:

无法从 'AForge.Point[]' 转换为 'System.Drawing.PointF[]'

我尝试更改 ImageProcess 方法和 ToPointsArray 中的一些内容,但效果始终相同。我还能尝试什么?我做错了什么?

代码如下:

public 部分 class Form1 : 表格 { public 表格 1() { 初始化组件(); }

    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;
    }

你的问题是 AForge 有自己的 Point 结构,所以你的 ToPointArray 方法实际上 returns 一个 Aforge 点数组而不是所需的 .net 点数组。最简单的解决方案是完全限定您要使用的类型,因此您的方法将变为

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

或者,如果您想保存一些字符,您可以在 class.

顶部使用 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();
}