Это основано на этот вопрос, который сосредоточен больше на 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
}
}
В принципе программа Сделаю:
contours[i]
contours[i]
на основании площади. Чем больше площадь становится largest_area
и самый большой контур станет largest_contours
DrawContours
а также imshow
Строка с проблемой покажет это сообщение над мышью:
Error: No operator "=" matches these operands
Вопрос в том, почему contours[i]
НЕ равно largest_contours
несмотря на то, что они имеют одинаковый класс (vector<vector<Point> >
) и иметь только одно значение для каждого контура за раз? Может кто-нибудь объяснить, почему и как это решить?
Заранее спасибо.
РЕДАКТИРОВАТЬ (1): Изменено contourArea(contours)
в contourArea(contours[i])
, Добавлена декларация для largest_contours
а также contours
,
Вы, кажется, путаетесь между тем, когда у вас есть коллекция чего-то и когда у вас ее нет. Я предполагаю, что 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]);
,
Здесь есть несколько проблем, точная причина ваших проблем не может быть определена без полных деклараций, однако есть несколько вещей, которые выглядят здесь странно:
double area = contourArea(contours);
Похоже, вы определяете площадь всех контуров в целом — каждую итерацию. Это звучит неправильно.
largest_contours = contours[i];
Скорее всего, это не получится, так как для контуров нет оператора присваивания. Как насчет сохранения индекса (если вы не хотите сохранить всю структуру (?)).