如何处理每个轮廓?

时间:2012-06-28 07:28:19

标签: opencv

我打算在某些图像上尝试轮廓。可以说我在二进制化之后有三个对象。这是否意味着我有三个轮廓?如果是,我该如何处理每个轮廓?

谢谢。

更新:我需要先处理blob#1。仅供参考,斑点并不完全像四边形。如果尝试使用cvSetImageROI但是blob#2和部分blob#3可能会出现在裁剪后的图像中。我在想,如果轮廓只能提取blob#1而没有blob#2和#3。这个解释清楚了吗? (使用C API而不是C ++ API)。

2 个答案:

答案 0 :(得分:2)

每个contour都是std::vector的数组(Points)。当您调用findContours时,它会返回二进制图像中的轮廓数组。这是一个简单的例子:

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Mat src;

findContours(src, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);

for(size_t i = 0; i<contours.size(); i++)
{
    //process contours[i]
    for (size_t j=0; j<contours[i].size(); j++)
    {
        int x = contours[i][j].x;
        int y = contours[i][j].y;
        // process point j in contour i
    }
}

Here's official OpenCV manual

答案 1 :(得分:0)

您应该使用函数cv::findContours。它将为您提供图像轮廓的分层列表。

doc

中的更多信息

修改 分层列表表示树状结构。 如果在另一个轮廓内有一个轮廓(例如一个带有孔的板),那么你可以要求函数返回一个保留包含信息的结构,或者如果你愿意的话,还可以返回一个扁平结构。