我正在尝试找到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
}
}
答案 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;
}