您的位置:首页 > 编程语言

Opencv2简洁代码提取连通区域

2016-03-22 18:55 459 查看
在用opencv2进行开发的时候,发现没有好用提取CCL的API,用contour呢效果还是有些区别。博主这里介绍一种只需要些许代码就能完成这项工作的方法,性能要差些。

假设已经是二值,如果是灰度,而且想两个像素差一点也算连通的话可以改CCLFunctor
class CCLFunctor
{
public:
bool operator()(const Point& i, const Point& j)
{
if (abs(i.x - j.x) <= 1 && abs(i.y - j.y) <= 1)
return true;
else
return false;
}
};
void ExtractCCL( const Mat& binaryImg,vector<vector<Point>>& ccls)
{
ccls.clear();
vector<Point> pts;
for (int r = 0; r < binaryImg.rows; ++r)
{
uchar* ptr = binaryImg.ptr<uchar>(r);
for (int c = 0;c < binaryImg.cols; ++c)
{
if(*(ptr+c) == 255)
pts.push_back(Point(c, r));
}
}
vector<int> labels;
int n = partition(pts, labels, CCLFunctor());
ccls.resize(n);
for(size_t i = 0;i < pts.size();++i)
{
ccls[labels[i]].push_back(pts[i]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: