这是基于这个问题,这个问题更关注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];
这很可能会失败,因为没有等值线的赋值运算符。如何保存索引(除非你想保留整个结构(?))。