//---------------------------------------------------------------------------------------------
 //---------------------------------------------------------------------------------------------
 //Растяжение до окружности
 private Point2D[] StretchToCircleAlongAxisY(
     CircleDescriptor circleDescriptor,
     double principalAxisCoordinateY,
     params Point2D[] points
     )
 {
     Point2D[] newPoints = new Point2D[points.Length];
     for (int index = 0; index < points.Length; index++)
     {
         Point2D  point        = points[index];
         double   x            = point.X;
         double   y            = point.Y;
         double[] coordinatesY = circleDescriptor.GetCoordinatesY(x);
         double   y1           = coordinatesY[0];
         double   y2           = coordinatesY[1];
         double   newY;
         if (y < principalAxisCoordinateY)
         {
             newY = y1 < circleDescriptor.Centre.Y ? y1 : y2;
         }
         else
         {
             newY = circleDescriptor.Centre.Y <= y1 ? y1 : y2;
         }
         Point2D newPoint = new Point2D(x, newY);
         newPoints[index] = newPoint;
     }
     return(newPoints);
 }
        /// <summary>
        /// 找圆
        /// </summary>
        /// <param name="image"></param>
        /// <param name="roi"></param>
        /// <returns></returns>
        public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null)
        {
            VisionResult rtn = new VisionResult();

            rtn.State = VisionResultState.WaitCal;
            try
            {
                var op1 = (this.OptionList[0] as DetectCurveOptions).Options;

                var roi = this.ROI.ConvertToRoi();
                if (parent != null && Result != null && !string.IsNullOrEmpty(parent.OrgCrood) && Result.ContainsKey(parent.OrgCrood))
                {
                    CoordinateSystem old      = new CoordinateSystem(parent.OrgPoint);
                    CoordinateSystem newCrood = new CoordinateSystem(Result[parent.OrgCrood].Point);
                    Algorithms.TransformRoi(roi, new CoordinateTransform(old, newCrood));
                }
                else if (newRoi != null)
                {
                    roi = newRoi.ConvertToRoi();
                }

                CircleDescriptor dsec = new CircleDescriptor(new Range(this.MinRadius, this.MaxRadius));
                var circles           = Algorithms.DetectCircles(image, dsec, roi, op1);

                if (circles.Count > 0)
                {
                    image.Overlays.Default.AddOval(circles[0].Circle, Rgb32Value.RedColor);
                    image.Overlays.Default.AddPoint(circles[0].Center, Rgb32Value.RedColor);
                    this.AddVisionResc(rtn, $"半径[{circles[0].Radius:N2}] 侦测到个数{circles.Count}");
                    rtn.Point = circles[0].Center;
                    rtn.State = VisionResultState.OK;
                }
                else
                {
                    this.AddVisionResc(rtn, "没有侦测到圆");
                    rtn.State = VisionResultState.NG;
                }
            }
            catch (VisionException ex)
            {
                this.AddVisionResc(rtn, ex.Message);
                rtn.State = VisionResultState.NG;
            }
            return(rtn);
        }
        //---------------------------------------------------------------------------------------------
        //Преобразовать точки к окружности
        private Point2D[] GetTransformedPoints(Point2D[] points2D)
        {
            EllipseApproximator ellipseApproximator = new EllipseApproximator();
            EllipseDescriptor   ellipseDescriptor   = ellipseApproximator.Approximate(points2D);

            Point2D ellipseCentre = ellipseDescriptor.GetCentre();

            points2D = PlaneManager.DisplacePoints(points2D, -ellipseCentre.X, -ellipseCentre.Y);

            double rotationAngle =
                ellipseDescriptor.GetAngleBetweenOxAndPrincipalAxis();

            points2D = this.RotatePoints(points2D, -rotationAngle);
            EllipseOrientaion pointsOrientation = this.GetPointsOrientation(points2D);

            if (pointsOrientation == EllipseOrientaion.AxisY)
            {
                points2D = this.RotatePoints(points2D, Math.PI / 2);
            }

            double radiusX = ellipseDescriptor.GetSemiMajorAxis();
            double radiusY = ellipseDescriptor.GetSemiMinorAxis();

            CanonicalEllipseDescriptor canonicalEllipseDescriptor =
                new CanonicalEllipseDescriptor(radiusX, radiusY);

            Point2D[] correctedToEllipsePoints =
                this.CorrectPointsToCanonicalEllipse(points2D, canonicalEllipseDescriptor);
            this.EllipsePoints = correctedToEllipsePoints;

            CircleDescriptor circleDescriptor = new CircleDescriptor(new Point2D(0, 0), radiusX);

            Point2D[] correctedToCirclePoints =
                this.StretchToCircleAlongAxisY(correctedToEllipsePoints, circleDescriptor, 0);

            return(correctedToCirclePoints);
        }
Beispiel #4
0
        public CircleDescriptorTests()
        {
            _fixture = new Fixture();

            _descriptor = new CircleDescriptor();
        }