контур не равен контуру[i]?

Это основано на этом вопросе, в котором основное внимание уделяется больше об OpenCV C++, поэтому я решил задать этот вопрос. Это часть моей программы:

vector<vector<Point> > contours;
vector<vector<Point> > largest_contours;

double largest_area = 0;
for(int i= 0; i < contours.size(); i++){
    double area = contourArea(contours[i]);
    if(area >= largest_area){
        largest_area = area;
        largest_contours = contours[i];  <---THIS is the problem
    }
}

В основном программа будет выполнять:

  1. Сканирует все контуры, обнаруженные в последовательности изображений/видео.
  2. Помечает контуры как contours[i]
  3. Вычисляет площадь каждого контура
  4. Сравнивает contours[i] по площади. Большая площадь становится largest_area, а самый большой контур становится largest_contours
  5. Наконец, DrawContours и imshow

Строка с проблемой покажет это сообщение над мышью:

Error: No operator "=" matches these operands

Вопрос в том, почему contours[i] НЕ равно largest_contours, несмотря на то, что они имеют один и тот же класс (vector<vector<Point> >) и имеют только одно значение для каждого контура одновременно? Может ли кто-нибудь объяснить, почему и как это решить?

Заранее спасибо.

РЕДАКТИРОВАТЬ (1): изменено contourArea(contours) на contourArea(contours[i]). Добавлено объявление для largest_contours и contours.


person Samir Izmier Chong    schedule 29.01.2013    source источник
comment
Показать объявления largest_contours и contours.   -  person Luchian Grigore    schedule 29.01.2013
comment
Я предполагаю, что контуры - это вектор‹вектор‹Точка›› и, следовательно, контуры[i] являются вектором‹Точка›, но в любом случае вам не нужно снова сохранять контур полностью, только его положение в массиве.   -  person TheMathemagician    schedule 29.01.2013


Ответы (2)


Вы, кажется, путаетесь между тем, когда у вас есть коллекция чего-то, и когда у вас ее нет. Я предполагаю, что vector<Point> — это то, что вы считаете «контуром», а vector<vector<Point>> — это набор контуров.

Когда вы выполняете цикл от 0 до contours.size(), вы работаете с contourArea(contours), который будет каждый раз точно таким же, потому что вы никогда не изменяете contours. Мне кажется, что вы хотите проработать площадь отдельного контура и должны делать что-то вроде contourArea(contours[i]).

Затем, если вам нужен список ваших самых больших контуров, который также имеет тип vector<vector<Point>>, вам нужно поместить каждый из найденных вами контуров в этот vector. Если contours[i] — это контур, который вы хотите добавить в список, вы должны сделать это с помощью largest_contours.push_back(contours[i]);.

person Joseph Mansfield    schedule 29.01.2013
comment
Ой, 2 человека уже предупредили меня за contourArea(contours), ха-ха. Спасибо за ответ - person Samir Izmier Chong; 29.01.2013

Здесь есть несколько проблем, точная причина ваших проблем не может быть определена без полных деклараций, однако здесь есть несколько вещей, которые выглядят странно:

double area = contourArea(contours);

Похоже, вы определяете площадь всех контуров в целом - каждую итерацию. Это звучит неправильно.

largest_contours = contours[i]; 

Это, скорее всего, не работает, поскольку для контуров нет оператора присваивания. Как насчет сохранения индекса (если только вы не хотите сохранить всю структуру (?)).

person Mario    schedule 29.01.2013
comment
Так что вместо contourArea(contours) я должен изменить его на contourArea(contours[i])? О сохранении индекса, можете ли вы объяснить мне больше? - person Samir Izmier Chong; 29.01.2013
comment
Я сейчас не уверен, возможно ли это, но я бы попробовал. Сохранение индекса: просто сохраните значение i, а не контур. Если мы говорим о простых векторах, вы можете просто вставить контур в другой вектор: largest_contours.clear(); largest_contours.insert(contours[i].begin(), contours[i].end()); - person Mario; 29.01.2013