Member 14129828 Ответов: 1

Как мне найти пять меньших фигур


Я пытаюсь найти пять меньших фигур среди многих фигур, но моя программа не работает хорошо, можете ли вы сказать мне, в чем проблема

Что я уже пробовал:

Image<Gray, byte> imgOutput = imgInput.Convert<Gray, byte>();
            binary = new Image<Gray, byte>(imgInput.Width, imgInput.Height, new Gray(0));
            CvInvoke.AdaptiveThreshold(imgOutput, binary, 255, Emgu.CV.CvEnum.AdaptiveThresholdType.GaussianC, Emgu.CV.CvEnum.ThresholdType.Binary, 5, 0.0);

            Emgu.CV.Util.VectorOfVectorOfPoint contours = new Emgu.CV.Util.VectorOfVectorOfPoint();

            Mat hier = new Mat();

            CvInvoke.FindContours(binary, contours, hier,     Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);
            Dictionary<int, double> dict = new Dictionary<int, double>();
            if (contours.Size > 0)
            {
                for (int i = 0; i < contours.Size; i++)
                {
                    double aera = CvInvoke.ContourArea(contours[i]);
                    Rectangle rect = CvInvoke.BoundingRectangle(contours[i]);
                   
                        dict.Add(i, aera);
                    
                }
            }
            var item = dict.OrderBy(v => v.Value).Take(5);
           
            foreach (var it in item)
            {
                int key = int.Parse(it.Key.ToString());
                Rectangle rect = CvInvoke.BoundingRectangle(contours[key]);
                CvInvoke.Rectangle(imgInput, rect, new MCvScalar(255, 0, 0), 8);
                pictureBox2.Image = imgInput.Bitmap;

                
            }
        }

Afzaal Ahmad Zeeshan

5 самых маленьких фигур в списке, или 5 фигур меньше размера, или что?

Простой ответ был бы таков: перечислите фигуры с их площадью, а затем отсортируйте их в порядке убывания на основе их площади и, наконец, получите топ-5.

Member 14129828

спасибо

BillWoodruff

Привет, Афзаал, я предлагаю вам опубликовать это как решение; мне кажется, это все, что нужно. Я подозреваю, что ОП также может использовать здесь SortedDictionary.

Member 14129828

Да... это обязательно и спасибо за ответ

Afzaal Ahmad Zeeshan

Привет Билл, я опубликовал это в качестве ответа и включил ваше предложение для SortedDictionary с предупреждением для операции.

1 Ответов

Рейтинг:
12

Afzaal Ahmad Zeeshan

Простой ответ был бы таков: перечислите фигуры с их площадью, а затем отсортируйте их в порядке убывания на основе их площади и, наконец, получите топ-5.

Кроме того, как и упоминал Билл в комментарии, Вы можете игнорировать Dictionary, и использовать SortedDictionary[^]. Это автоматически сортирует данные для вас, и Вы читаете их один за другим. Пожалуйста, прочтите эту ссылку, чтобы понять, как это работает. Однако, если вы будете сортировать данные по ключу, вы можете сохранить только одну фигуру для каждого веса.


BillWoodruff

+5 я понимаю вашу точку зрения: SortedDictionary не может иметь дубликатов ключей ! Я думаю, что он мог бы использовать SortedSet с пользовательским IComparer: https://stackoverflow.com/questions/5716423/c-sharp-sortable-collection-which-allows-duplicate-keys/34523348 ... но, вероятно, так же эффективно писать более простой код, который просто использует сортировку Linq.

Afzaal Ahmad Zeeshan

Спасибо, Билл! :-)