这是基于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
问题是, why is contours[i]
is NOT equal to largest_contours
尽管它们具有相同的类( vector<vector<Point> >
),并且每次只有一个值用于每个轮廓?任何人都可以解释为什么以及如何解决它?
提前致谢 .
编辑(1):将 contourArea(contours)
更改为 contourArea(contours[i])
. 添加了 largest_contours
和 contours
的声明 .
2 回答
当你收集某些东西时,你似乎在混淆你猜测
vector<Point>
是你认为"contour"和vector<vector<Point>>
是一组轮廓 .当你从0循环到
contours.size()
时,你正在研究contourArea(contours)
,每次都会完全相同,因为你永远不会修改contours
. 在我看来,你想要找出一个单独轮廓的区域,应该做contourArea(contours[i])
之类的事情 .然后,如果您想要一个最大轮廓列表(类型为
vector<vector<Point>>
),则需要将找到的每个轮廓推入vector
. 如果contours[i]
是要添加到列表中的轮廓,则可以使用largest_contours.push_back(contours[i]);
执行此操作 .这里有几个问题,如果没有完整的声明,你的问题的确切原因无法确定,但是有些事情看起来很奇怪:
这看起来像您确定所有轮廓的总面积 - 每次迭代 . 这听起来不对 .
这很可能失败,因为轮廓没有赋值运算符 . 如何保存索引(除非你想保留整个结构(?)) .