0

我打算在一些图像上尝试轮廓。假设我在二值化后有三个对象。这是否意味着我有三个轮廓?如果是,我如何处理每个轮廓?

谢谢你。

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

4

2 回答 2

3

每个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
    }
}

这是官方的 OpenCV 手册

于 2012-06-28T07:49:58.673 回答
0

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

文档中的更多信息。

编辑 分层列表意味着树状结构。如果另一个轮廓内部有轮廓(例如,考虑一个带孔的板),那么您可以要求该函数返回一个保留包含信息的结构,或者如果您愿意,可以返回一个平面结构。

于 2012-06-28T07:48:14.667 回答