private bool isContourFree(ElementSequence contour) { foreach (ElementSequence checkContour in Contours.Where(i => i.Nodes.Length == contour.Count)) { int i = -1; while (++i < contour.Count) { if (!checkContour.Nodes.Contains(contour.Nodes[i])) { break; } } if (i == contour.Count) { return(false); } } return(true); }
public ContouredImage(string imageFile) { GreyImage = getPreprocessedImage(imageFile); //!!!try to make more primitive //Mat tmp = grey.clone(); //morphologyEx(tmp, tmp, MORPH_GRADIENT, getStructuringElement(MORPH_ELLIPSE, Size(3, 3))); //bitwise_not(tmp, tmp); //!!!try to smooth //epsilon = 0.1 * cv.arcLength(cnt, True) //approx = cv.approxPolyDP(cnt, epsilon, True) Emgu.CV.CvInvoke.FindContours(GreyImage, CvContours, Hierarchy, RetrType.List, ChainApproxMethod.ChainApproxSimple); Array hierarchy = Hierarchy.GetData(); for (int i = 0; i < CvContours.Size; i++) { Contours.Add(new Contour(hierarchy, i, CvContours[i])); } RobustContours = Contours.Where(x => x.Points.Size >= MinContourPointCount).ToList();//!!!RotatedRect cannot be calculated for Points.Size < 5 }
public void PointsInputHandler(object sender, MouseEventArgs e) { Contour currentContour = Contours.FirstOrDefault(x => !x.IsCompleted); if (currentContour == null) { currentContour = new Contour(Contours.Count + 1); Contours.Add(currentContour); } var newPoint = new Point(e.X, _drawer.CanvasHeight - e.Y) { Index = _lastPointIndex + 1 }; if (currentContour.Head == null) { currentContour.Add(newPoint); _drawer.DrawPoints(Pens.Black, newPoint); //Ekaterina _drawer.RefreshImage(); //end Ekaterina _lastPointIndex++; } else { if (currentContour.Tail == null) { var newLineSegment = new LineSegment(currentContour.Head, newPoint); if (Contours.Where(x => x != currentContour).Any(x => x.IntersectsWithLineSegment(newLineSegment, IntersectionCheckOptions.WithEdgePoints)) || currentContour.IntersectsWithLineSegment(newLineSegment, IntersectionCheckOptions.WithoutEdgePoints)) { MessageBox.Show(ErrorMessageBoxMessage, ErrorMessageBoxTitle); } else { currentContour.Add(newPoint); _drawer.DrawLineSegments(Pens.Black, newLineSegment); _lastPointIndex++; } } else { var newLineSegment = new LineSegment(currentContour.Tail, newPoint); if (Contours.Where(x => x != currentContour).Any(x => x.IntersectsWithLineSegment(newLineSegment, IntersectionCheckOptions.WithEdgePoints)) || currentContour.IntersectsWithLineSegment(newLineSegment, IntersectionCheckOptions.WithoutEdgePoints)) { MessageBox.Show(ErrorMessageBoxMessage, ErrorMessageBoxTitle); } else { currentContour.Add(newPoint); if (!currentContour.IsCompleted) { _drawer.DrawLineSegments(Pens.Black, newLineSegment); _lastPointIndex++; } else { _drawer.DrawLineSegments(Pens.Black, new LineSegment(currentContour.Tail, currentContour.Head)); } } } } if (currentContour.IsCompleted) { _tabControlHelper.CreatePageForContour(currentContour); } }