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 { if (parent != null && image != null && Result != null) { Collection <PointContour> pt = new Collection <PointContour>(); if (CrossList.Count >= 3) { for (int i = 0; i < CrossList.Count; ++i) { if (Result.ContainsKey(this.CrossList[i])) { pt.Add(Result[this.CrossList[i]].Point); } else { return(rtn); } } FitCircleReport report = Algorithms.FitCircle(pt); rtn.Point = report.Center; this.AddVisionResc(rtn, "拟合成功"); image.Overlays.Default.AddOval(report.Circle, Rgb32Value.RedColor); image.Overlays.Default.AddPoint(rtn.Point, Rgb32Value.RedColor); image.Overlays.Default.AddRoi(report.Circle.ConvertToRoi()); rtn.State = VisionResultState.OK; } else { this.AddVisionResc(rtn, "拟合点数据少于3"); rtn.State = VisionResultState.NG; } } else { throw new Exception("没有找到对应结果"); } } catch (Exception ex) { this.AddVisionResc(rtn, ex.Message); rtn.State = VisionResultState.NG; } return(rtn); }
private FitCircleReport FindCircularEdge(VisionImage image, AnnulusContour searchAnnulus, SpokeDirection spokeDirection, DrawOptions drawOptions, CoordinateTransform transform) { // Add the search rectangle to an Roi. Roi roi = new Roi(new Shape[] { searchAnnulus }); // Transform the Roi. Algorithms.TransformRoi(roi, transform); // Perform a spoke operation. SpokeReport report = Algorithms.Spoke(image, roi, spokeDirection, EdgeProcess.FirstAndLast, 8); Collection <PointContour> circlePoints = new Collection <PointContour>(); foreach (EdgeInfo edgeInfo in report.FirstEdges) { circlePoints.Add(edgeInfo.Position); } // Fit a circle to the points found. FitCircleReport circleReport = Algorithms.FitCircle(circlePoints); // Draw the results. if (drawOptions.ShowSearchLines) { foreach (SearchLineInfo lineInfo in report.SearchLines) { image.Overlays.Default.AddLine(lineInfo.Line, Rgb32Value.BlueColor); DrawArrow(image.Overlays.Default, lineInfo.Line, Rgb32Value.BlueColor); } } if (drawOptions.ShowSearchArea) { image.Overlays.Default.AddRoi(roi); } if (drawOptions.ShowEdgesFound) { foreach (EdgeInfo edgeInfo in report.FirstEdges) { image.Overlays.Default.AddRectangle(new RectangleContour(edgeInfo.Position.X - 1, edgeInfo.Position.Y - 1, 3, 3), Rgb32Value.YellowColor, DrawingMode.PaintValue); } } if (drawOptions.ShowResult) { // Overlay the center point. image.Overlays.Default.AddOval(new OvalContour(circleReport.Center.X - 2, circleReport.Center.Y - 2, 5, 5), Rgb32Value.RedColor, DrawingMode.PaintValue); // Overlay the circle. image.Overlays.Default.AddOval(new OvalContour(circleReport.Center.X - circleReport.Radius, circleReport.Center.Y - circleReport.Radius, 2 * circleReport.Radius, 2 * circleReport.Radius), Rgb32Value.RedColor, DrawingMode.DrawValue); } return(circleReport); }
private void timer1_Tick(object sender, EventArgs e) { // Get the next image. VisionImage image = GetNextImage(); // Find the new coordinate transformation. MatchPatternOptions matchOptions = new MatchPatternOptions(MatchMode.RotationInvariant); matchOptions.MinimumMatchScore = 700; matchOptions.SubpixelAccuracy = true; DrawOptions drawOptions = new DrawOptions(); drawOptions.ShowResult = true; FindTransformWithPattern(image, imageViewer2.Image, FindTransformMode.UpdateTransform, matchOptions, drawOptions, transform); // Initialize search rectangle and search annulus. RectangleContour searchRectangle = new RectangleContour(470, 110, 30, 190); AnnulusContour searchAnnulus = new AnnulusContour(new PointContour(366, 201), 33, 121, 42.71, 314.13); // Overlay the search area for the distance measurement. drawOptions.ShowEdgesFound = true; drawOptions.ShowSearchArea = true; drawOptions.ShowSearchLines = true; drawOptions.ShowResult = true; double distance = MeasureMaximumDistance(image, searchRectangle, RakeDirection.TopToBottom, drawOptions, transform); // Overlay the search area for the circle measurement. FitCircleReport circleReport = FindCircularEdge(image, searchAnnulus, SpokeDirection.InsideToOutside, drawOptions, transform); // Display results. distanceBox.Text = String.Format("{0:0.00}", distance); centerXBox.Text = String.Format("{0:0.00}", circleReport.Center.X); centerYBox.Text = String.Format("{0:0.00}", circleReport.Center.Y); radiusBox.Text = String.Format("{0:0.00}", circleReport.Radius); // Display the image. imageViewer1.Attach(image); }