主要基于connectedComponents()函数;
int cv::connectedComponents (InputArray image,
OutputArray labels,
int connectivity,
int ltype,
int ccltype
)
输入图像必须是二值图像,如果不是,请先进行二值化。
connectivity:可选择4连通或8连通,即 connectivity = 4或8;
ltype:输出label图像的type
return N,代表共有N-1个标签,其中0为背景标签,注意默认原图黑色的为背景。
示例:
string file_name("C:/Users/XXXX.png");//路径,改成自己的
Mat image = imread(file_name, 0);
Mat imageShold;
threshold(image, imageShold, 100, 255, THRESH_BINARY);//二值化
Mat labels;
int n_comps = connectedComponents(imageShold, labels, 4, CV_16U);
cout << "轮廓数" << n_comps << endl;
//draw
int rows = image.rows;
int cols = image.cols;
Mat src_color;// = Mat::zeros(imageShold.size(), CV_8UC3);
src_color.create(rows, cols, CV_8UC3);
src_color = Scalar::all(0);
for (int x = 0; x < rows; x++)
{
for (int y = 0; y < cols; y++)
{
int label = labels.at<__int16>(x, y);//注意labels是CV_16U类型
if (label == 0)
{
src_color.at<Vec3b>(x, y) = Vec3b(255, 255, 255);
continue;
}
src_color.at<Vec3b>(x, y)[0] = (label*10*10*10) % 255;
src_color.at<Vec3b>(x, y)[1] = (label*10*10) % 255;
src_color.at<Vec3b>(x, y)[2] = (label*10) % 255;
}
}
imwrite("C:/Users/XXXXXXX.png", src_color);//路径,改成自己的
输入:
输出: