示例#1
0
        private static List <ContourWithMass> SortDeterminationOfCentromass(List <ContourWithMass> point)
        {
            var endPointAfterMass = new List <ContourWithMass>(); //  лист для хранения ВСЕХ ИСТИННЫХ КОНТУРОВ
            int i = 0, k = 0;                                     // счетчик для отсечки

            // цикл находящий подобные контуры
            while (i < point.Count)
            {
                var tresult = new List <ContourWithMass>();
                for (int j = k; j < point.Count; j++)
                {
                    if (((point[i].Mass.X <= point[j].Mass.X + 2) && (point[j].Mass.X - 2 <= point[i].Mass.X)) &&
                        ((point[i].Mass.Y <= point[j].Mass.Y + 2) && (point[j].Mass.Y - 2 <= point[i].Mass.Y)))
                    {
                        //создание нового экземпляра класса
                        ContourWithMass massVar = new ContourWithMass();
                        massVar.Contr = point[j].Contr;
                        tresult.Add(massVar);
                        k++;
                    }
                }
                List <ContourWithMass> SortedList  = tresult.OrderByDescending(o => o.Contr.Count).ToList(); // сортировка листа по убыванию по числу точек контура
                List <ContourWithMass> SortedList2 = SortedList.OrderBy(o => o.Contr[0].X).ToList();         // сортировка по центру массы
                // использование класса , но уже с хранением не центра масс , а последней точки контура
                ContourWithMass STRUCTendPointAndContr = new ContourWithMass();
                STRUCTendPointAndContr.Mass.X = SortedList2[0].Contr[SortedList2[0].Contr.Count - 1].X;
                STRUCTendPointAndContr.Mass.Y = SortedList2[0].Contr[SortedList2[0].Contr.Count - 1].Y;
                STRUCTendPointAndContr.Contr  = SortedList2[0].Contr;
                endPointAfterMass.Add(STRUCTendPointAndContr);
                i = k;// происходит отческа ,т.е на новом шаге происходит обработка новой коллекции подобных контуров
            }
            return(endPointAfterMass);
        }
示例#2
0
        public static IList <ContourWithMass> DeterminationOfCentromass(Image <Gray, byte> bin, ChainApproxMethod method)
        {
            var totalresult = new List <ContourWithMass>(); // лист для хранения ВСЕХ НАЙДЕНЫХ КОНТУРОВ
            Mat hierarchy   = new Mat();                    // выделение массива для хранения контуров

            using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint())
            {
                CvInvoke.FindContours(bin, contours, hierarchy, RetrType.List, method);//поиск контуров
                {
                    for (int i = 0; i < contours.Size; i++)
                    {
                        using (VectorOfPoint contour = contours[i])// ищем i-тый контур в коллекции всех контуров
                        {
                            ContourWithMass massVar = new ContourWithMass();
                            var             result  = new List <Point>();
                            result.Add(new Point(contour[contour.Size - 1].X, contour[contour.Size - 1].Y));
                            result.AddRange(contour.ToArray());
                            massVar.Mass.X = (int)result.Average(_ => _.X);
                            massVar.Mass.Y = (int)result.Average(_ => _.Y);
                            massVar.Contr  = result;
                            totalresult.Add(massVar);
                        }
                    }
                }
            }
            List <ContourWithMass> SortedList = totalresult.OrderByDescending(o => o.Mass.X).ToList();
            var sortToX = SortDeterminationOfCentromass(SortedList);

            return(sortToX);
        }