Пример #1
0
        public static void GetAllObjects(Bitmap src, out Bitmap result, out List <BloodObjects> allObjects, string adrWEB)
        {
            allObjects = new List <BloodObjects>();
            string adr = string.Empty;

            try
            {
                adr = "temp.jpg";
                File.Delete(adr);
                src.Save(adr);
            }
            catch (System.Runtime.InteropServices.ExternalException)
            {
                adr = adrWEB;
                File.Delete(adr);
                src.Save(adr);
            }
            IplImage image = Cv.LoadImage(adr, LoadMode.AnyColor);
            IplImage gray  = Cv.CreateImage(Cv.GetSize(image), BitDepth.U8, 1);
            IplImage bin   = Cv.CreateImage(Cv.GetSize(image), BitDepth.U8, 1);
            IplImage dst   = Cv.CloneImage(image);

            Cv.CvtColor(image, gray, ColorConversion.RgbToGray);
            Cv.InRangeS(gray, 150, 255, bin);
            CvMemStorage    storage  = Cv.CreateMemStorage(0);
            CvSeq <CvPoint> contours = null;
            int             cont     = Cv.FindContours(bin, storage, out contours, CvContour.SizeOf, ContourRetrieval.List, ContourChain.ApproxTC89KCOS, Cv.Point(0, 0));

            contours = Cv.ApproxPoly(contours, CvContour.SizeOf, storage, ApproxPolyMethod.DP, 0, true);
            int id = 0;

            for (CvSeq <CvPoint> seq0 = contours; seq0 != null; seq0 = seq0.HNext)
            {
                if (Cv.ContourArea(seq0) > 100 && Cv.ContourArea(seq0) < (image.Height * image.Width * 0.5))
                {
                    CvMoments moments = new CvMoments();
                    Cv.Moments(seq0, out moments, true);
                    double xc       = (moments.M10 / moments.M00);
                    double yc       = (moments.M01 / moments.M00);
                    double distance = Math.Sqrt(xc * xc + yc * yc);
                    allObjects.Add(new BloodObjects(
                                       id,
                                       seq0,
                                       seq0.ToList(),
                                       Cv.ContourArea(seq0),
                                       new CvPoint2D32f(xc, yc),
                                       distance,
                                       Math.Pow(Cv.ContourPerimeter(seq0), 2) / Cv.ContourArea(seq0),
                                       Cv.ContourPerimeter(seq0),
                                       Group.Interest));
                    id++;
                }
            }
            allObjects = Classified(allObjects);
            allObjects.Sort(delegate(BloodObjects ob1, BloodObjects ob2)
            {
                return(ob1.Distance.CompareTo(ob2.Distance));
            });
            for (int i = 0; i < allObjects.Count; i++)
            {
                allObjects[i].Id = i;
                if (allObjects[i].Group == Group.Interest)
                {
                    Cv.DrawContours(dst, allObjects[i].Contour, Cv.RGB(0, 250, 0), Cv.RGB(50, 250, 0), 0, -1, LineType.Link8);
                }
                else if (allObjects[i].Group == Group.Small)
                {
                    Cv.DrawContours(dst, allObjects[i].Contour, Cv.RGB(0, 0, 250), Cv.RGB(50, 250, 0), 0, -1, LineType.Link8);
                }
                else
                {
                    Cv.DrawContours(dst, allObjects[i].Contour, Cv.RGB(250, 0, 0), Cv.RGB(50, 250, 0), 0, -1, LineType.Link8);
                }
                dst.PutText(
                    allObjects[i].Id.ToString(),
                    allObjects[i].Center,
                    new CvFont(FontFace.HersheySimplex, 0.4, 0.4, 0.5, 1, LineType.Link8),
                    CvColor.Black);
            }
            allObjects.Sort(delegate(BloodObjects ob1, BloodObjects ob2)
            {
                return(ob1.Id.CompareTo(ob2.Id));
            });
            result = dst.ToBitmap();
        }