IsConvexPolygon() public method

Check if the specified set of points form a convex polygon shape.

The method is able to detect only triangles and quadrilaterals for now. Check number of detected corners to resolve type of the detected polygon.

public IsConvexPolygon ( List edgePoints, List &corners ) : bool
edgePoints List Shape's points to check.
corners List List of polygon corners on successful return.
return bool
Esempio n. 1
0
        public void CalculateShapes()
        {
            circles.Clear();
            triangles.Clear();
            quadrilaterals.Clear();
            polylines.Clear();

            CalculateBlobs();

            Ag.SimpleShapeChecker shapeChecker = new Ag.SimpleShapeChecker();

            if (Angle >= 0)
            {
                shapeChecker.AngleError = (float)Angle;
            }
            if (Length >= 0)
            {
                shapeChecker.LengthError = (float)Length;
            }
            if (Distortion >= 0)
            {
                shapeChecker.MinAcceptableDistortion = (float)Distortion;
            }

            foreach (Blob blob in blobObjects)
            {
                List <Accord.IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blob);

                Accord.Point center;
                float        radius;

                if (shapeChecker.IsCircle(edgePoints, out center, out radius))
                {
                    circles.Add(new Rg.Circle(Rg.Plane.WorldXY, center.ToRhPoint(bitmap.Height), radius).ToNurbsCurve());
                }
                else
                {
                    List <Accord.IntPoint> corners;
                    if (edgePoints.Count > 2)
                    {
                        if (shapeChecker.IsConvexPolygon(edgePoints, out corners))
                        {
                            if (shapeChecker.IsTriangle(edgePoints))
                            {
                                triangles.Add(corners.ToRhinoPoints(bitmap.Height).ToPolyline(true).ToNurbsCurve());
                            }
                            else if (shapeChecker.IsQuadrilateral(edgePoints))
                            {
                                quadrilaterals.Add(corners.ToRhinoPoints(bitmap.Height).ToPolyline(true).ToNurbsCurve());
                            }
                            else
                            {
                                polylines.Add(corners.ToRhinoPoints(bitmap.Height).ToPolyline(true).ToNurbsCurve());
                            }
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        // Process image
        private void ProcessImage(Bitmap bitmap)
        {
            // lock image
            BitmapData bitmapData = bitmap.LockBits(
                new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                ImageLockMode.ReadWrite, bitmap.PixelFormat);

            // step 1 - turn background to black
            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);

            // step 2 - locating objects
            BlobCounter blobCounter = new BlobCounter();

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

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

            // step 3 - check objects' type and highlight
            SimpleShapeChecker shapeChecker = new SimpleShapeChecker();

            Graphics g = Graphics.FromImage(bitmap);
            Pen yellowPen = new Pen(Color.Yellow, 2); // circles
            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]);

                Accord.Point center;
                float radius;

                // is circle ?
                if (shapeChecker.IsCircle(edgePoints, out center, out radius))
                {
                    g.DrawEllipse(yellowPen,
                        (float)(center.X - radius), (float)(center.Y - radius),
                        (float)(radius * 2), (float)(radius * 2));
                }
                else
                {
                    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));
                    }
                }
            }

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

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

            UpdatePictureBoxPosition();
        }