AForge净简单形状检测错误

时间:2015-01-01 18:51:16

标签: c# shape detection aforge

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

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

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

这是代码:

公共部分类Form1:表单     {         公共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;
    }

1 个答案:

答案 0 :(得分:3)

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

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