opencv_c++学习(十八)

news/2025/2/21 6:53:58/

一、连通域分析

连通域分割原理:
在这里插入图片描述
邻域分为4邻域和8邻域。如上图所示。当使用连通域分割方法时,需要首先将图像进行二值化处理,在进行连通域的处理。右图为连通域分割两遍法的一个示意图,具体原理可以自行查询,这里只分享实操部分。
连通域分割函数:

connectedComponents(InputArray image, OutputArray labels,  int 8, int ltype = cv_325)

image:待标记不同连通域的图像单通道,数据类型必须为CV_8U
labels:标记不同连通域后的输出图像,与输入图像具有相同的尺寸。
connectivity:标记连通域时使用的邻域种类,4表示4-邻域,8表示8-邻域,默认参数为8。
ltype:输出图像的数据类型,目前支持CV_32S和CV_16U两种数据类型,默认参数为CV_32S。
分割并统计连通域信息的函数:

connectedComponentswithStats(InputArray image, OutputArray labels, outputArray stats,utputArray centroids, connectivity =, int 8, int ltype = cv_32s

image:待标记不同连通域的图像单通道,数据类型必须为CV_8U。
labels:标记不同连通域后的输出图像,与输入图像具有相同的尺寸。
stats:不同连通域的统计信息矩阵,矩阵的数据类型为Cv_32S。矩阵中第i行是标签为i的连通域的统计特性。
centroids:每个连通域的质心坐标,数据类型为CV_64F。
connectivity:标记连通域时使用的邻域种类,4表示4-邻域,8表示8-邻域,默认参数值为8。
ltype:输出图像的数据类型,目前只支持CV_32s和lCV_16U这两种数据类型,默认参数值为CV_328。
在这里插入图片描述
分割检测应用案例:

int main() {//读取图片Mat src = imread("图片1.png", IMREAD_ANYCOLOR);if (src.empty()){printf("不能打开空图片");return -1;}//暂存图像二值化的Mat对象Mat src1, src_BW;//将图像进行二值化操作cvtColor(src, src1, COLOR_BGR2GRAY);threshold(src1, src_BW, 50, 255, THRESH_BINARY);//生成随机颜色,用于区分不用连通域RNG rng(10000);Mat out;//统计图像中连通域的个数int number = connectedComponents(src_BW, out, 8, CV_16U);//对图像进行分割vector<Vec3b> colors;for (int i = 0; i < number; i++){//使用均匀分布的随机数确定颜色Vec3b vec3 = Vec3b(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));colors.push_back(vec3);}//使用不同的颜色连通域标注//新建一个空白矩阵Mat result = Mat::zeros(src1.size(), src.type());int w = result.cols;int h = result.rows;//开始标注,逐像素点标注for (int row = 0; row < h; row++){for (int col = 0; col < w; col++){int label = out.at<uint16_t>(row, col);//如果为背景,则不改变if (label ==0){continue;}result.at<Vec3b>(row, col) = colors[label];}}imshow("123", result);//统计连通域信息Mat stats, centorids;number = connectedComponentsWithStats(src_BW, out, stats, centorids, 8, CV_16U);//对图像进行分割vector<Vec3b> colors_new;for (int i = 0; i < number; i++){//使用均匀分布的随机数确定颜色Vec3b vec3 = Vec3b(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));colors_new.push_back(vec3);}//使用不同的颜色连通域标注//开始标注,逐像素点标注for (int i = 1; i < number; i++){//中心位置int center_x = centorids.at<double>(i, 0);int center_y = centorids.at<double>(i, 1);//矩形边框int x = stats.at<int>(i, CC_STAT_LEFT);int y = stats.at<int>(i, CC_STAT_TOP);int h = stats.at<int>(i, CC_STAT_WIDTH);int w = stats.at<int>(i, CC_STAT_HEIGHT);int area = stats.at<int>(i, CC_STAT_AREA);//绘制中心位置circle(src, Point(center_x, center_y), 2, Scalar(0, 255, 0), 2, 8, 0);//绘制外接矩形Rect rect(x, y, h, w);rectangle(src, rect, colors_new[i], 1, 8, 0);putText(src, format("%d", i), Point(center_x, center_y), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 255), 1);cout << "number:" << i << "area:" << area << endl;}imshow("biaoji", src);waitKey(0);return 0;
}

http://www.ppmy.cn/news/85374.html

相关文章

Python调用腾讯云函数传递json数据

前言 有些时候有一些公共的方法&#xff0c;需要放在服务器上&#xff0c;在不同的电脑上使用。但是我们有没有自己的服务器&#xff0c;所以考虑将公共的方法放在腾讯云、华为云、阿里云、百度云等云平台上&#xff0c;方便在不同的电脑上复用。 我们这里使用的是腾讯云&#…

【C语言】数组名作函数参数

数组名作函数参数 引例思考例2通用性指针形参和数组形参几点说明 引例 在主函数中输入10个整数&#xff0c;并存入一个一维数组中&#xff1b;然后在被调函数中&#xff0c;将0号元素的值改为原值的10倍&#xff1b;最后在主函数中输出结果。 思路&#xff1a; 若想在被调函数…

【Linux】线程同步/生产消费模型/线程池/读写锁

目录 1.Linux线程同步 1.1.条件变量 1.1.1.同步概念与竞态条件 1.1.2.条件变量函数 初始化和销毁 1.1.3.等待条件满足 1.1.5.为什么 pthread_cond_wait 需要互斥量? 1.1.6.条件变量使用规范 2.生产者消费者模型 2.1.模型概念 2.2.模型优点 2.3.基于Blocking Queue的…

MySQL---事务

1. 事务操作 开启事务&#xff1a;Start Transaction 任何一条DML语句(insert、update、delete)执行&#xff0c; 标志事务的开启命令&#xff1a;BEGIN 或 START TRANSACTION 提交事务&#xff1a;Commit Transaction 成功的结束&#xff0c;将所有的DML语句操作历史记录…

小电流接地系统单相接地故障选线及保护

小电流接地系统单相接地故障选线及保护 姓名[1] 【摘要】&#xff1a;小电流系统单相接地故障选线以及定位一直是研究的热点&#xff0c;本文基于小电流系统出现单相接地短路后的特征&#xff0c;提出利用稳态特征和暂态特征信息结合的方式进行故障选线与保护&#xff0c;然后利…

【数据结构】线性表之栈、队列

前言 前面两篇文章讲述了关于线性表中的顺序表与链表&#xff0c;这篇文章继续讲述线性表中的栈和队列。 这里讲述的两种线性表与前面的线性表不同&#xff0c;只允许在一端入数据&#xff0c;一段出数据&#xff0c;详细内容请看下面的文章。 顺序表与链表两篇文章的链接&…

Selenium2023最全攻略(元素操作,浏览器操作等)附完整代码!

一、元素操作方法 方法&#xff1a; 1、.send_keys() # 输入方法 2、.click() # 点击方法 3、.clear() # 清空方法 注意&#xff1a;在输入方法之前一定要清空操作!! # 导包 from time import sleep from selenium import webdriver # 实例化浏览器 driver webdriver.Chrome(…

Tomcat源码:Acceptor与Poller、PollerEvent

参考资料&#xff1a; 《Tomcat源码解析系列&#xff08;十一&#xff09;ProtocolHandler》 《Tomcat源码解析系列&#xff08;十二&#xff09;NioEndpoint》 前文&#xff1a; 《Tomcat源码&#xff1a;启动类Bootstrap与Catalina的加载》 《Tomcat源码&#xff1a;容器…