Exemplo n.º 1
0
        internal IList <Point> GetPointsOfInterest(GrayscaleStandardImage image, FormType formType, Area area)
        {
            var allForms = CornersBuilder.GetCornerForms();

            var results =
                FormSimilarityHelper.Instance.SearchForForm(allForms.Where(f => f.Type == formType).ToList(), image,
                                                            area);

            // SORT TAKE HALF BEST
            results = results.OrderByDescending(s => s.Similarity).ToList();
            results = results.Take(results.Count / 2).ToList();
            return(GroupSimilarityResults(results));
        }
Exemplo n.º 2
0
        public void Test()
        {
            string directory = AppDomain.CurrentDomain.BaseDirectory;
            var    path      = Path.Combine(directory, $"Reports/Algorithms tests/{DateTime.UtcNow.ToString("yyyyMMddHHmmss")}/");

            Directory.CreateDirectory(path);

            var report = new OperationTestReport
            {
                Date        = DateTime.UtcNow,
                ImagesCount = _testCases.Count,
                Results     = new Dictionary <Operation, OperationTestResult>()
            };

            foreach (Operation operation in Enum.GetValues(typeof(Operation)))
            {
                report.Results.Add(operation, new OperationTestResult
                {
                    Accuracy = 100,
                    ExecutionTimePerImageMs = 0,
                    SuccessRatio            = 100
                });
            }

            for (int i = 0; i < _testCases.Count; i++)
            {
                // Step Conversion
                var step = Operation.ImageConversion;
                _stopwatch.Start();
                var bitmap              = _testCases[i];
                var reducedBitmap       = bitmap.ReduceSize((double)500 / Math.Max(bitmap.Width, bitmap.Height));
                var targetBitmap        = bitmap.ReduceSize((double)1000 / Math.Max(bitmap.Width, bitmap.Height));
                var targetStandardImage = targetBitmap.ConvertToStandardImage(100);
                var image = reducedBitmap.ConvertToStandardImage(100);
                _stopwatch.Stop();
                report.Results[step].ExecutionTimePerImageMs += _stopwatch.ElapsedMilliseconds;
                _stopwatch.Reset();
                image.ConvertToBitmap().Save(path + $"Initial Image{i + 1}.jpg", ImageFormat.Jpeg);

                // Step preparation
                step = Operation.ImagePreparation;
                _stopwatch.Start();
                var svMap     = ImageHelper.GetSVMap(image);
                var svPikes   = ImageHelper.GetSvPikes(svMap);
                var grayImage = _documentPreparationService.IsolateDocument(image, svPikes);
                _stopwatch.Stop();
                report.Results[step].ExecutionTimePerImageMs += _stopwatch.ElapsedMilliseconds;
                _stopwatch.Reset();
                image = grayImage.ConvertToStandardImage();
                image.ConvertToBitmap().Save(path + $"PreparationResult_{i + 1}.jpg", ImageFormat.Jpeg);

                // Step Corner Detection
                step = Operation.ImageCornerDetection;
                _stopwatch.Start();
                var masks         = new Dictionary <FormType, Area>();
                var widthOverlay  = image.Width / 10;
                var heightOverlay = image.Height / 10;

                masks.Add(FormType.TopLeft, new Area(0, 0, image.Width / 2 + widthOverlay, image.Height / 2 + heightOverlay));
                masks.Add(FormType.TopRight, new Area(image.Width / 2 - widthOverlay, 0, image.Width, image.Height / 2 + heightOverlay));
                masks.Add(FormType.BottomLeft, new Area(0, image.Height / 2 - heightOverlay, image.Width / 2 + widthOverlay, image.Height));
                masks.Add(FormType.BottomRight, new Area(image.Width / 2 - widthOverlay, image.Height / 2 - heightOverlay, image.Width, image.Height));
                var allForms         = CornersBuilder.GetCornerForms();
                var copiedImage      = grayImage.ConvertToStandardImage();
                var potentialCorners = new ConcurrentDictionary <FormType, IList <Point> >();
                var interestColor    = Color.FromArgb(200, 255, 200);
                var lineColor        = Color.FromArgb(255, 0, 0);
                var cornerColor      = Color.FromArgb(255, 200, 255);
                var lines            = new ConcurrentBag <Line>();
                Parallel.ForEach(masks.Keys, (form) =>
                {
                    var interests = _documentCornersDetectionService.GetPointsOfInterest(grayImage, form, masks[form]);


                    foreach (var interest in interests)
                    {
                        copiedImage = ImageHelper.DrawIndicator(copiedImage, interest.X, interest.Y, 5, interestColor);
                    }
                    var partialLines = _documentCornersDetectionService.GetLines(interests, grayImage);

                    foreach (var partialLine in partialLines)
                    {
                        lines.Add(partialLine);
                    }
                });

                foreach (var line in lines)
                {
                    var pixels = ImageHelper.GetLinePixels(line.P1.X, line.P1.Y, line.P2.X, line.P2.Y);
                    copiedImage = copiedImage.DrawPixels(pixels, lineColor);
                }

                var corners = _documentCornersDetectionService.GetCorners(lines.ToList(), grayImage);

                //foreach (var corner in corners)
                //{
                //    copiedImage = ImageHelper.DrawIndicator(copiedImage, corner.X, corner.Y, 5, cornerColor);
                //    potentialCorners.TryAdd(form, corners);
                //}

                var finalCorners = _documentCornersDetectionService.GetFinalCorners(grayImage,
                                                                                    potentialCorners.ToDictionary(kvp => kvp.Key, kvp => kvp.Value));

                foreach (var finalCorner in finalCorners)
                {
                    copiedImage = ImageHelper.DrawIndicator(copiedImage, finalCorner.X, finalCorner.Y, 5, lineColor);
                }

                _stopwatch.Stop();
                report.Results[step].ExecutionTimePerImageMs += _stopwatch.ElapsedMilliseconds;
                _stopwatch.Reset();
                copiedImage.ConvertToBitmap().Save(path + $"CornersResult_{i + 1}.jpg", ImageFormat.Jpeg);

                var           originalRatio = targetStandardImage.Height / grayImage.Height;
                IList <Point> originalCornersCoordinates = new List <Point>();
                foreach (var corner in finalCorners)
                {
                    originalCornersCoordinates.Add(new Point(corner.X * originalRatio, corner.Y * originalRatio));
                }

                // Step Straightening
                step = Operation.ImageStraightening;
                _stopwatch.Start();
                var straightenImage = _documentStraightenerService.StraightenDocument(targetStandardImage, originalCornersCoordinates);
                _stopwatch.Stop();
                report.Results[step].ExecutionTimePerImageMs += _stopwatch.ElapsedMilliseconds;
                _stopwatch.Reset();

                _stopwatch.Stop();
                straightenImage.ConvertToBitmap().Save(path + $"StraightenedResult{i + 1}.jpg", ImageFormat.Jpeg);
            }

            long totalExecutionTime = 0;

            foreach (var op in report.Results.Keys.ToList())
            {
                report.Results[op].ExecutionTimePerImageMs = report.Results[op].ExecutionTimePerImageMs / _testCases.Count;
                totalExecutionTime += report.Results[op].ExecutionTimePerImageMs;
            }

            report.TotalExecutionTimeMs = totalExecutionTime;

            string json = JsonConvert.SerializeObject(report);

            File.WriteAllText(path + "report.txt", json);
        }