轮廓不等于轮廓[i]?

时间:2013-01-29 11:52:45

标签: c++ opencv contour

这是基于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会:

  1. 扫描图像序列/视频中检测到的每个轮廓
  2. 将轮廓标记为contours[i]
  3. 计算每个轮廓的面积
  4. 根据区域比较contours[i]。较大的区域变为largest_area,最大的轮廓将变为largest_contours
  5. 最后,DrawContoursimshow
  6. 有问题的行将通过鼠标显示此消息:

    Error: No operator "=" matches these operands
    

    问题是,为什么 contours[i] 不等于 largest_contours,尽管它们具有相同的类(vector<vector<Point> >)并且每次只有一个轮廓值?任何人都可以解释为什么以及如何解决它?

    提前致谢。

    编辑(1):将contourArea(contours)更改为contourArea(contours[i])。添加了largest_contourscontours的声明。

2 个答案:

答案 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]);执行此操作。