Проблема в сортировке контуров по размеру области контура - PullRequest
1 голос
/ 23 сентября 2019

Я сегментирую камни.Для сравнения результатов сегментации I:

  1. Найти контуры двоичного изображения сегментированного изображения
  2. Найти область контура
  3. Сортировать область
  4. Найдите самое большое n и сравните его с истинностью основания

Проблема, однако, такова:

-> Сортировка не дает n самых больших, скажем, 5, контуров,Я не понимаю, почему.

Вот входное изображение:

Input Image

Все контуры после сортировки:

all contours

И, первые 5 контуров изображения:

5 contours

Результат, который я ожидаю, простопервые 5 или n число самых больших контуров.Чтобы быть точным, первый и второй по величине должны быть большими коричневыми камнями на правой стороне изображения RGB.

Код для сортировки приведен на стр. 417

Мой код (грубая его часть) для отображения первых 5 контуров приведен ниже:

 // Sorting by descending order
struct AreaCmp {    
AreaCmp(const vector<float>& _areas) : areas(&_areas) {}    
bool operator()(int a, int b) const { return (*areas)[a] > (*areas)[b]; }   
 const vector<float>* areas;};


int main{

  std::vector<std::vector<cv::Point>> contours;
  std::vector<cv::Vec4i> hierarchy;// There is no hierarchy formed because of CV_RETR_LIST

  cv::findContours(input_image, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);//CV_CHAIN_APPROX_SIMPLE

  std::vector<int> sortIdx(contours.size());
  std::vector<float> areas(contours.size());

  for( int n = 0; n < (int)contours.size(); n++)
  {
      sortIdx[n] = n;
      areas[n] = cv::contourArea(contours[n], false);
  }

  std::sort(sortIdx.begin(), sortIdx.end(), AreaCmp(areas));

  FINROC_LOG_PRINT(DEBUG, "sortIdx size", (int)sortIdx.size());
  FINROC_LOG_PRINT(DEBUG, "contours size", (int)contours.size());

  int q = 0;
  for( int n = 0; n < (int)sortIdx.size(); n++)
  {
      int idx = sortIdx[n];
      cv::drawContours(input_rgb_image, contours, idx, cv::Scalar(0,255,0), 1, 8, hierarchy);
      q++;
      if(q > 5) break; // to draw only the first 5

  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...