Пример #1
0
        static void Main(string[] args)
        {
            string path     = Path.Combine(typeof(Program).Assembly.CodeBase.Replace("file:///", "").Replace("/", "\\"), "..");
            string fileName = args.Length > 0 ? args[0] : string.Empty;

            if (!string.IsNullOrEmpty(fileName))
            {
                EllipseDetector detector = new EllipseDetector(fileName);
                Tuple <Size, List <EllipseResult> > res = detector.Search();
                List <EllipseResult> resultEllipses     = res.Item2;

                using (var bitmap = new Bitmap(fileName))
                    using (Graphics graphics = Graphics.FromImage(bitmap))
                    {
                        Brush aBrushCenter = Brushes.Blue;

                        int i = 0;
                        foreach (var result in resultEllipses)
                        {
                            var aBrush = i % 2 == 0 ? Brushes.Red : Brushes.Green;
                            graphics.FillRectangle(aBrushCenter, result.Center.X, result.Center.Y, 5, 5);
                            for (double angle = 0.0f; angle < Math.PI * 2; angle += 0.01f)
                            {
                                var v2X = result.RadiusA * Math.Cos(angle);
                                var v2Y = result.RadiusB * Math.Sin(angle);
                                var vx  = v2X * Math.Cos(result.Radian) - v2Y * Math.Sin(result.Radian) + result.Center.X;
                                var vy  = v2Y * Math.Cos(result.Radian) + v2X * Math.Sin(result.Radian) + result.Center.Y;

                                var points2 = new[] { new PointF(), new PointF() };
                                points2[0].X = (float)vx;
                                points2[0].Y = (float)vy;
                                points2[1].X = (float)vx;
                                points2[1].Y = (float)vy;
                                graphics.FillRectangle(aBrush, points2[0].X, points2[0].Y, 3, 3);
                            }

                            i++;
                        }
                        var fi = new FileInfo(fileName);

                        bitmap.Save(Path.Combine(path, "output" + fi.Name), bitmap.RawFormat);
                        Console.WriteLine("--------------------------------");
                        Console.WriteLine("Execution Time: ");
                        var times = detector.Execution;

                        Console.WriteLine("Edge Detection: \t{0}", times.EdgeDetection);
                        Console.WriteLine("Pre processing: \t{0}", times.PreProcessing);
                        Console.WriteLine("Grouping:       \t{0}", times.Grouping);
                        Console.WriteLine("Estimation:     \t{0}", times.Estimation);
                        Console.WriteLine("Validation:     \t{0}", times.Validation);
                        Console.WriteLine("Clustering:     \t{0}", times.Clustering);
                        Console.WriteLine("--------------------------------");
                        Console.WriteLine("Total:	         \t{0}", times.Total);
                        Console.WriteLine("--------------------------------");

                        Console.ReadKey();
                    }
            }
        }
Пример #2
0
        /// <summary>
        /// Find the marker ellipses.
        /// </summary>
        /// <param name="gray">Binary image</param>
        /// <param name="finals">List of ellipses</param>
        /// <param name="ids">Resulting ids of marker ellipses, ordered by the number of transitions descending</param>
        /// <returns>True if all marker ellipses where found, false otherwise</returns>
        private bool FindMarkerEllipses(Emgu.CV.Image <Gray, byte> gray, List <DetectedEllipse> finals, out int[] ids)
        {
            ids = new int[4] {
                -1, -1, -1, -1
            };

            for (int i = 0; i < finals.Count; ++i)
            {
                int transitions = CountBinaryTransitions(finals[i], EllipseDetector.GetAffineFrame(finals[i].Ellipse), gray);
                switch (transitions)
                {
                case 8:
                    if (ids[0] > -1)
                    {
                        return(false);
                    }
                    ids[0] = i;
                    break;

                case 6:
                    if (ids[1] > -1)
                    {
                        return(false);
                    }
                    ids[1] = i;
                    break;

                case 4:
                    if (ids[2] > -1)
                    {
                        return(false);
                    }
                    ids[2] = i;
                    break;

                case 2:
                    if (ids[3] > -1)
                    {
                        return(false);
                    }
                    ids[3] = i;
                    break;
                }
            }
            return(ids.Count(value => { return (value > -1); }) == 4);
        }
Пример #3
0
        static void Main(string[] args)
        {
            string path     = Path.Combine(typeof(Program).Assembly.CodeBase.Replace("file:///", "").Replace("/", "\\"), "..");
            string fileName = args.Length > 0 ? args[0] : string.Empty;

            if (!string.IsNullOrEmpty(fileName))
            {
                var inputMat = CvInvoke.Imread(fileName);
                var grayMat  = new Mat();
                CvInvoke.CvtColor(inputMat, grayMat, ColorConversion.Bgr2Gray);
                EllipseDetector detector = new EllipseDetector();
                detector.Detect(grayMat, out var ellipses);

                using (var bitmap = new Bitmap(fileName))
                    using (Graphics graphics = Graphics.FromImage(bitmap))
                    {
                        Brush aBrushCenter = Brushes.Blue;

                        int i = 0;
                        foreach (var result in ellipses)
                        {
                            var aBrush = i % 2 == 0 ? Brushes.Red : Brushes.Green;
                            graphics.FillRectangle(aBrushCenter, result.Center.X, result.Center.Y, 5, 5);
                            for (double angle = 0.0f; angle < Math.PI * 2; angle += 0.01f)
                            {
                                var v2X = result.MajorSemiAxisLengthA * Math.Cos(angle);
                                var v2Y = result.MinorSemiAxisLengthB * Math.Sin(angle);
                                var vx  = v2X * Math.Cos(result.OrientationAngleInRadian) - v2Y * Math.Sin(result.OrientationAngleInRadian) + result.Center.X;
                                var vy  = v2Y * Math.Cos(result.OrientationAngleInRadian) + v2X * Math.Sin(result.OrientationAngleInRadian) + result.Center.Y;

                                var points2 = new[] { new PointF(), new PointF() };
                                points2[0].X = (float)vx;
                                points2[0].Y = (float)vy;
                                points2[1].X = (float)vx;
                                points2[1].Y = (float)vy;
                                graphics.FillRectangle(aBrush, points2[0].X, points2[0].Y, 3, 3);
                            }

                            i++;
                        }
                        var fi = new FileInfo(fileName);

                        bitmap.Save(Path.Combine(path, "output" + fi.Name), bitmap.RawFormat);
                        Console.WriteLine("--------------------------------");
                        Console.WriteLine("Execution Time: ");
                        var times = detector.ExecTime;

                        Console.WriteLine("Edge Detection: \t{0}", times.EdgeDetection);
                        Console.WriteLine("Pre processing: \t{0}", times.PreProcessing);
                        Console.WriteLine("Grouping:       \t{0}", times.Grouping);
                        Console.WriteLine("Estimation:     \t{0}", times.Estimation);
                        Console.WriteLine("Validation:     \t{0}", times.Validation);
                        Console.WriteLine("Clustering:     \t{0}", times.Clustering);
                        Console.WriteLine("--------------------------------");
                        Console.WriteLine("Total:	         \t{0}", times.Total);
                        Console.WriteLine("--------------------------------");

                        Console.ReadKey();
                    }
            }
        }