public IEnumerable<IFindResult> Find(ISegmentationResult segmantationResult) { var image = segmantationResult.SegmentationMatrix; int width = segmantationResult.SegmentationMatrix.GetLength(0); int height = segmantationResult.SegmentationMatrix.GetLength(1); var points = new List<Point>(); foreach (var segment in segmantationResult.Segments.Where(s => s.Square > 50)) { Point minX = new Point(width - 1, 0), maxX = new Point(), maxY = new Point(), minY = new Point(0, height - 1); points.Clear(); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (image[x, y] == segment.Id) { var currentPoint = new Point(x, y); points.Add(currentPoint); if (x <= minX.X) { minX = currentPoint; } else if (x >= maxX.X) { maxX = currentPoint; } else if (y <= minY.Y) { minY = currentPoint; } else if (y >= maxY.Y) { maxY = currentPoint; } } } } var minXminY = new Point(minX.X, minY.Y); var maxXminY = new Point(maxX.X, minY.Y); var minXmaxY = new Point(minX.X, maxY.Y); var parWidth = Math.Abs(minXminY.X - maxXminY.X); var parHeight = Math.Abs(minXminY.Y - minXmaxY.Y); var formFactor = parWidth / (double)parHeight; if ((formFactor > 3) && (formFactor < 6)) // 520mm X 113mm form-factor s/p4,64 a/b = 4,6 { var rect = Cv2.MinAreaRect(points.Select(p => new Point2f(p.X, p.Y))); float resultRectSquare =rect.Size.Width*rect.Size.Height; formFactor = Math.Max(rect.Size.Width, rect.Size.Height) / Math.Min(rect.Size.Width, rect.Size.Height); if (segment.Square / resultRectSquare > 0.5 && (rect.Size.Width > 100 || rect.Size.Height > 100) && (formFactor > 4.1) && (formFactor < 6)) { yield return new FindResult(rect.Points().Select(p => new Point((int)p.X, (int)p.Y)).ToList()); } } } }
public IEnumerable <IFindResult> Find(ISegmentationResult segmantationResult) { var image = segmantationResult.SegmentationMatrix; int width = segmantationResult.SegmentationMatrix.GetLength(0); int height = segmantationResult.SegmentationMatrix.GetLength(1); var points = new List <Point>(); foreach (var segment in segmantationResult.Segments.Where(s => s.Square > 50)) { Point minX = new Point(width - 1, 0), maxX = new Point(), maxY = new Point(), minY = new Point(0, height - 1); points.Clear(); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (image[x, y] == segment.Id) { var currentPoint = new Point(x, y); points.Add(currentPoint); if (x <= minX.X) { minX = currentPoint; } else if (x >= maxX.X) { maxX = currentPoint; } else if (y <= minY.Y) { minY = currentPoint; } else if (y >= maxY.Y) { maxY = currentPoint; } } } } var minXminY = new Point(minX.X, minY.Y); var maxXminY = new Point(maxX.X, minY.Y); var minXmaxY = new Point(minX.X, maxY.Y); var parWidth = Math.Abs(minXminY.X - maxXminY.X); var parHeight = Math.Abs(minXminY.Y - minXmaxY.Y); var formFactor = parWidth / (double)parHeight; // if ((formFactor > 4.1) && (formFactor < 5.1)) // 520mm X 113mm form-factor s/p4,64 a/b = 4,6 if ((formFactor > 1.2) && (formFactor < 1.8)) // 520mm X 113mm form-factor s/p4,64 a/b = 4,6 { //yield return new FindResult(new List<Point> { minXmaxY, minXminY, maxXminY, new Point(maxX.X, maxY.Y) }); var hough = new HoughConversion(); double imageDiagonal = new Point(0, 0).Distanse(new Point(width, height)); IList <Line> lines = hough.AccumulateLines(points, imageDiagonal); lines = this.FilterLines(lines); if (lines.Count != 0) { //foreach (var findResult in this.DrawLines(lines, width, height)) //{ // yield return findResult; //} var result = PrepareResult(lines); if (result != null) { yield return(result); } } } } }
public IEnumerable<IFindResult> Find(ISegmentationResult segmantationResult) { var image = segmantationResult.SegmentationMatrix; int width = segmantationResult.SegmentationMatrix.GetLength(0); int height = segmantationResult.SegmentationMatrix.GetLength(1); var points = new List<Point>(); foreach (var segment in segmantationResult.Segments.Where(s => s.Square > 50)) { Point minX = new Point(width - 1, 0), maxX = new Point(), maxY = new Point(), minY = new Point(0, height - 1); points.Clear(); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (image[x, y] == segment.Id) { var currentPoint = new Point(x, y); points.Add(currentPoint); if (x <= minX.X) { minX = currentPoint; } else if (x >= maxX.X) { maxX = currentPoint; } else if (y <= minY.Y) { minY = currentPoint; } else if (y >= maxY.Y) { maxY = currentPoint; } } } } var minXminY = new Point(minX.X, minY.Y); var maxXminY = new Point(maxX.X, minY.Y); var minXmaxY = new Point(minX.X, maxY.Y); var parWidth = Math.Abs(minXminY.X - maxXminY.X); var parHeight = Math.Abs(minXminY.Y - minXmaxY.Y); var formFactor = parWidth / (double)parHeight; // if ((formFactor > 4.1) && (formFactor < 5.1)) // 520mm X 113mm form-factor s/p4,64 a/b = 4,6 if ((formFactor > 1.2) && (formFactor < 1.8)) // 520mm X 113mm form-factor s/p4,64 a/b = 4,6 { //yield return new FindResult(new List<Point> { minXmaxY, minXminY, maxXminY, new Point(maxX.X, maxY.Y) }); var hough = new HoughConversion(); double imageDiagonal = new Point(0, 0).Distanse(new Point(width, height)); IList<Line> lines = hough.AccumulateLines(points, imageDiagonal); lines = this.FilterLines(lines); if (lines.Count != 0) { //foreach (var findResult in this.DrawLines(lines, width, height)) //{ // yield return findResult; //} var result = PrepareResult(lines); if (result != null) { yield return result; } } } } }