//--------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------- //Растяжение до окружности 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); }
public CircleDescriptorTests() { _fixture = new Fixture(); _descriptor = new CircleDescriptor(); }