我打算在某些图像上尝试轮廓。可以说我在二进制化之后有三个对象。这是否意味着我有三个轮廓?如果是,我该如何处理每个轮廓?
谢谢。
更新:我需要先处理blob#1。仅供参考,斑点并不完全像四边形。如果尝试使用cvSetImageROI但是blob#2和部分blob#3可能会出现在裁剪后的图像中。我在想,如果轮廓只能提取blob#1而没有blob#2和#3。这个解释清楚了吗? (使用C API而不是C ++ API)。
答案 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
}
}
答案 1 :(得分:0)
您应该使用函数cv::findContours
。它将为您提供图像轮廓的分层列表。
doc。
中的更多信息修改强> 分层列表表示树状结构。 如果在另一个轮廓内有一个轮廓(例如一个带有孔的板),那么你可以要求函数返回一个保留包含信息的结构,或者如果你愿意的话,还可以返回一个扁平结构。