private static FindCircularEdgeReport IVA_FindCircularEdge(VisionImage image,
                                                                   Roi roi,
                                                                   SpokeDirection direction,
                                                                   EdgeOptions options,
                                                                   CircularEdgeFitOptions fitOptions,
                                                                   IVA_Data ivaData,
                                                                   int stepIndex)
        {
            // First, delete all the results of this step (from a previous iteration)
            Functions.IVA_DisposeStepResults(ivaData, stepIndex);
            FindCircularEdgeOptions circleOptions = new FindCircularEdgeOptions(direction);

            circleOptions.EdgeOptions = options;
            FindCircularEdgeReport circleReport = new FindCircularEdgeReport();

            // Calculate the edge locations
            circleReport = Algorithms.FindCircularEdge(image, roi, circleOptions, fitOptions);

            // If a circle was found, add results
            if (circleReport.CircleFound)
            {
                ivaData.stepResults[stepIndex].results.Add(new IVA_Result("Center.X Position (Pix.)", circleReport.Center.X));
                ivaData.stepResults[stepIndex].results.Add(new IVA_Result("Center.Y Position (Pix.)", circleReport.Center.Y));
                if ((image.InfoTypes & InfoTypes.Calibration) != 0)
                {
                    ivaData.stepResults[stepIndex].results.Add(new IVA_Result("Center.X Position (Calibrated)", circleReport.CenterCalibrated.X));
                    ivaData.stepResults[stepIndex].results.Add(new IVA_Result("Center.Y Position (Calibrated)", circleReport.CenterCalibrated.Y));
                }
                ivaData.stepResults[stepIndex].results.Add(new IVA_Result("Radius (Pix.)", circleReport.Radius));
                if ((image.InfoTypes & InfoTypes.Calibration) != 0)
                {
                    ivaData.stepResults[stepIndex].results.Add(new IVA_Result("Radius (Calibrated)", circleReport.RadiusCalibrated));
                }
                ivaData.stepResults[stepIndex].results.Add(new IVA_Result("Deviation", circleReport.Roundness));
            }
            return(circleReport);
        }
示例#2
0
 public static extern IntPtr imaqSpoke2(IntPtr image, ref ROI roi, SpokeDirection direction, EdgeProcess process, int stepSize, ref EdgeOptions2 edgeOptions);
示例#3
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);
        }
示例#4
0
 public static extern IntPtr imaqSpoke(IntPtr image, ref ROI roi, SpokeDirection direction, EdgeProcess process, ref SpokeOptions options);