如何使用opencv 247访问cvSeq元素以查找轮廓区域?

时间:2014-02-23 19:38:36

标签: visual-c++ opencv image-processing

我正在尝试找到cvSeq轮廓的区域,但我无法找到访问序列元素的正确语法。 这是我想要纠正的代码。有谁可以帮助我?

  for (int i = 0; i < contours->elem_size; i++)       // iterate through each contour.
  {
      double a = contourArea(contours[i], false);     //  Find the area of contour
      if (a > largest_area) {
          largest_area = a;
          largest_contour_index = i;                  // Store the index of largest contour
          bounding_rect = boundingRect(contours[i]);  // Find the bounding rectangle for biggest     contour
      }
  }

1 个答案:

答案 0 :(得分:2)

首先,我假设您已使用cvFindContours获取示例中的轮廓列表。

示例代码中的CvSeq结构指针contours指向“动态增长序列”中的第一个轮廓。您假设的elem_size是轮廓列表中的轮廓数,而不是列表中每个元素的大小。来自documentation

  

int elem_size

     

每个序列元素的大小(以字节为单位)

相反,序列中元素的数量由下式给出:

  

int 总计

     

序列元素的数量

至少有两种方法可以迭代轮廓序列:

作为数组

for (int i = 0; i < contours->total; i += contours->elem_size)
{
    double a = contourArea(contours[i], false);
    if (a > largest_area)
    {
        largest_area = a;
        largest_contour_index = i;
        bounding_rect = boundingRect(contours[i]);
    }
}

作为链接列表

请注意!这假设您在调用cvFindContours时使用了模式 CV_RETR_LIST (在不建立任何层次关系的情况下检索所有轮廓)。如果不是,结果可能会存储在树中,需要相应地遍历。

CvSeq *it = contours;

while (it)
{
    double a = contourArea(it, false);
    if (a > largest_area)
    {
        largest_area = a;
        largest_contour_index = i;
        bounding_rect = boundingRect(it);
    }
    it = it->h_next;
}