Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }