这是基于this question,它更侧重于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
}
}
基本上the program会:
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
的声明。
答案 0 :(得分:1)
这里有几个问题,如果没有完整的声明,你的问题的确切原因无法确定,但是有些事情在这里看起来很奇怪:
double area = contourArea(contours);
这看起来总是确定所有轮廓的面积 - 每次迭代。这听起来不对。
largest_contours = contours[i];
这很可能失败,因为轮廓没有赋值运算符。如何保存索引(除非你想保留整个结构(?))。
答案 1 :(得分:1)
当你收集某些东西而不收藏东西时,你似乎变得混乱。我猜测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]);
执行此操作。