Я хочу сделать программу, которая обнаруживает все объекты на изображении и удаляет все, кроме самого большого. Я нарисовал все отдельные ограничивающие рамки и контуры, но как мне сравнить размер каждой отдельной ограничивающей рамки/контура, чтобы определить, какой из них самый большой?
Размер отдельных ограничивающих рамок?
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
Да, они типа cv::rectangle. Я попробую с этим кодом. Спасибо!
- person TheAlPaca02; 23.05.2014
Эй, @Cyber, я снова смотрел на этот код и задавался вопросом, что такое pLargestBox и pCurrentBox на самом деле. Я имею в виду, они какие-то переменные? Потому что я не вижу, чтобы они были определены.
- person TheAlPaca02; 26.05.2014
@ TheAlPaca02 Это указатели на
CvRect
объекты. Я предположил, что у вас есть вектор этих объектов в vBoundingBoxes
. Поэтому я перебирал этот вектор по одному и разыменовывал итератор *it
, содержащий объект CvRect
. Вы знакомы с указателями? Если нет, то некоторые из них могут нуждаться в дополнительном объяснении.
- person Cory Kramer; 26.05.2014
Да, я знаком с указателями, просто я никогда не видел префикс «p» для их объявления. Здесь все используют звездочку, ха-ха. Спасибо, что развеяли мои сомнения!
- person TheAlPaca02; 27.05.2014
@ TheAlPaca02 О, это называется венгерская нотация, это широко распространенный стиль именования. Вы начинаете имя переменной с первой буквы типа bFlag (логическое значение), dAnswer (двойное), pThingy (указатель) и т. д.
- person Cory Kramer; 27.05.2014