Размер отдельных ограничивающих рамок?

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


person TheAlPaca02    schedule 23.05.2014    source источник
comment
Вы читали это answers.opencv.org/? вопрос/7171/   -  person Aurélien Ooms    schedule 23.05.2014
comment
Самый большой периметр будет проще всего вычислить   -  person stark    schedule 23.05.2014
comment
Приятно читать @AurélienOoms, спасибо!   -  person TheAlPaca02    schedule 23.05.2014


Ответы (1)


Являются ли ваши ограничивающие рамки CvRect объектами? Предполагая, что «самый большой» означает самую большую площадь, вы можете сделать что-то вроде этого.

std::vector<CvRect*> vBoundingBoxes;    // assume this has all your boxes
int largestArea = 0;
CvRect* pLargestBox = NULL;

for (auto it = vBoundingBoxes.begin(); it != vBoundingBoxes.end(); ++it)
{
    CvRect* pCurrentBox = *it;
    int iArea = pCurrentBox->width * pCurrentBox->length;
    if (iArea > largestArea)
    {
        largestArea = iArea;
        pLargestBox = pCurrentBox;
    }
}
person Cory Kramer    schedule 23.05.2014
comment
Да, они типа cv::rectangle. Я попробую с этим кодом. Спасибо! - person TheAlPaca02; 23.05.2014
comment
Эй, @Cyber, я снова смотрел на этот код и задавался вопросом, что такое pLargestBox и pCurrentBox на самом деле. Я имею в виду, они какие-то переменные? Потому что я не вижу, чтобы они были определены. - person TheAlPaca02; 26.05.2014
comment
@ TheAlPaca02 Это указатели на CvRect объекты. Я предположил, что у вас есть вектор этих объектов в vBoundingBoxes. Поэтому я перебирал этот вектор по одному и разыменовывал итератор *it, содержащий объект CvRect. Вы знакомы с указателями? Если нет, то некоторые из них могут нуждаться в дополнительном объяснении. - person Cory Kramer; 26.05.2014
comment
Да, я знаком с указателями, просто я никогда не видел префикс «p» для их объявления. Здесь все используют звездочку, ха-ха. Спасибо, что развеяли мои сомнения! - person TheAlPaca02; 27.05.2014
comment
@ TheAlPaca02 О, это называется венгерская нотация, это широко распространенный стиль именования. Вы начинаете имя переменной с первой буквы типа bFlag (логическое значение), dAnswer (двойное), pThingy (указатель) и т. д. - person Cory Kramer; 27.05.2014