Я сегментирую камни.Для сравнения результатов сегментации I:
- Найти контуры двоичного изображения сегментированного изображения
- Найти область контура
- Сортировать область
- Найдите самое большое n и сравните его с истинностью основания
Проблема, однако, такова:
-> Сортировка не дает n самых больших, скажем, 5, контуров,Я не понимаю, почему.
Вот входное изображение:
Все контуры после сортировки:
И, первые 5 контуров изображения:
Результат, который я ожидаю, простопервые 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
}
}