opencv学习笔记2:opencv中connectedComponentsWithStats用法

opencv中connectedComponentsWithStats用法

文章目录

    • opencv中connectedComponentsWithStats用法
  • 前言
  • 使用步骤
  • 总结


前言

opencv中新增了connectedComonentWithStats函数,可以帮助我们直接找到一张图片的连通区域,不用再自己写连通函数了
函数示例:
int cv::connectedComponentsWithStats ( InputArray image,
OutputArray labels, //输入图像,8位单通道
OutputArray stats,
OutputArray centroids,
int connectivity = 8,
int ltype = CV_32S
)


使用步骤

代码如下(示例):

#include 
#include 
#include  
#include 
#include 
#include 


using namespace cv;
using namespace std;

//八连通、计算质心坐标
int main(int argc,char **argv)
{
    Mat src=imread("1.jpg");  //要处理的图像,名称为1.jpg
    cvtColor(src, gray, COLOR_BGR2GRAY);    //转为灰度图像
	//imshow("灰度图像", gray);
	GaussianBlur(gray, gray, Size(3, 3), 5);  //高斯模糊去噪
	threshold(gray, dist_binary, 11, 255, THRESH_BINARY); //二值化

	//2.八连通标记
	//labels里是每个区域的标记,stats分别对应各个轮廓的外接矩阵的x,y,width,height和面积,centroids对应质心
	Mat labels, stats, centroids;
	int nccomps = connectedComponentsWithStats(
		dist_binary, labels,
		stats, centroids
		);

	/*ofstream myfile;
	myfile.open("centroids.csv");
	myfile << cv::format(centroids, cv::Formatter::FMT_CSV) << std::endl;
	myfile.close();*/

	//输出质心坐标(x是列,y是行)
    //遍历质心所有行
	for (int i = 1; i < centroids.rows; i++)
	{
		int x = centroids.at<double>(i, 0);
		int y = centroids.at<double>(i, 1);
		Point p(x, y);
		//画出几何中心
		circle(src, p, 1, Scalar(0, 0, 255), 2, 8);
		cout << "第" << i << "个金属的质心坐标为:";
		cout << x;
		cout << " ";
		cout << y;
		cout << endl;
	}
	imshow("标记质心之后的图像为:", src);

	//每一个标记的统计信息,是一个5列的矩阵,每一行对应每个连通区域的外接矩形的x、y、width、height和面积
	//cout <<"每个标记的统计信息:"<
	cout << "金属总个数为:" << nccomps - 1 << endl;
	waitKey(0);
}


总结

可以用此函数找连通区域和形心

你可能感兴趣的:(opencv,计算机视觉)