/// <summary> /// Returns a List of Shapes found in the gray Image and returns Linesegments and color of shape /// </summary> /// <param name="inImg">Gray Image</param> /// <param name="refImg">Color Image for shapecolor</param> /// <param name="lines">outputarray for lines</param> /// <param name="colors">outputarry for linecolors</param> /// <returns></returns> public List <ShapeColorObject> findShapesinGrayImg(Emgu.CV.Image <Gray, Byte> inImg, Emgu.CV.Image <Hsv, Byte> refImg, int index) { if (inImg == null || refImg == null) { return(null); } List <ShapeColorObject> funkshapes = new List <ShapeColorObject>(); for (Contour <Point> contours = inImg.FindContours(); contours != null; contours = contours.HNext) { Contour <Point> current = contours.ApproxPoly(contours.Perimeter * 0.008); if (current.Area > 200) { Point[] points = current.ToArray(); int meanX = 0; int meanY = 0; foreach (Point p in points) { meanX += p.X; meanY += p.Y; } meanX /= current.Total; meanY /= current.Total; ShapeColorObject newObj; Hsv col; if (current.Total == 3) //3 vertices { col = new Hsv(0, 255, 220); newObj = new ShapeColorObject(current.Area, ShapeColorObject.shape.tri, refImg[meanY, meanX], meanX, meanY); newObj.imIndex = index; funkshapes.Add(newObj); } else if (current.Total == 4 && current.Convex) //4 vertices convex { col = new Hsv(45, 255, 220); newObj = new ShapeColorObject(current.Area, ShapeColorObject.shape.rect, refImg[meanY, meanX], meanX, meanY); newObj.imIndex = index; funkshapes.Add(newObj); } else if (current.Total > 8 && current.Convex) //8+ vertices (circle) convex { col = new Hsv(90, 255, 220); newObj = new ShapeColorObject(current.Area, ShapeColorObject.shape.circle, refImg[meanY, meanX], meanX, meanY); newObj.imIndex = index; funkshapes.Add(newObj); } else //other shapes { col = new Hsv(135, 255, 220); newObj = new ShapeColorObject(current.Area, ShapeColorObject.shape.undef, refImg[meanY, meanX], meanX, meanY); newObj.imIndex = index; funkshapes.Add(newObj); } for (int i = 0; i < current.Total - 1; i++) { newObj.lineSegments.Add(new LineSegment2D(points[i], points[i + 1])); //add contour line segments to new ShapeColorObject } newObj.lineSegments.Add(new LineSegment2D(points[current.Total - 1], points[0])); double cirumf = 0; foreach (LineSegment2D s in newObj.lineSegments) { cirumf += s.Length; } newObj.circularity = (float)(cirumf * cirumf / current.Area); } //ende if(200>area) } //ende von for(contours....) return(funkshapes); }
public int apply(string fileName, string output) { int counter = 0; Emgu.CV.Image<Bgr, Byte> imgS = new Emgu.CV.Image<Bgr, Byte>(fileName); Emgu.CV.Image<Gray, Byte> img = new Emgu.CV.Image<Gray, Byte>(fileName); //Emgu.CV.Image<Gray, Byte> imgGray = new Image<Gray, byte>(img.Width, img.Height); //CvInvoke.cvCvtColor(img, imgGray, COLOR_CONVERSION.BGR2GRAY); int thresh = 1; int max_thresh = 255; img = img.ThresholdBinary(new Gray(thresh), new Gray(max_thresh)); img.Save(output.Replace(".", "_binary.")); Contour<Point> contur = img.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_CCOMP); Emgu.CV.CvInvoke.cvDrawContours(imgS, contur, new MCvScalar(0, 0, 255), new MCvScalar(0, 0, 255), 1, 1, LINE_TYPE.EIGHT_CONNECTED, new Point(0, 0)); contur = img.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_CCOMP); while (contur != null && contur.HNext != null) { if (counter == 0) { counter++; } contur = contur.HNext; counter++; } MCvFont font = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_SIMPLEX, 0.8f, 0.8f); MCvScalar color = new MCvScalar(255, 255, 255); CvInvoke.cvPutText(imgS, "counter:" + counter, new Point(10, 20), ref font, color); imgS.Save(output); return counter; }