opencv(C++) 连通域分析函数 connectedComponentsWithStats() 用法

2023-11-16


connectedComponentsWithStats() 是一个非常好用的连通域分析函数,可以检测连通域,获取连通域的面积、宽度/高度、质心和左上角顶点坐标等。

1、函数用法

Mat labels;      //CV_32F通道的标签矩阵,不同的连通域被赋予不同的标签值(int类型)
Mat stats;       //包含连通域统计信息的矩阵
Mat centroids;   //连通域的质心坐标矩阵
int num = connectedComponentsWithStats(src, labels, stats, centroids, 8, CV_16U);

2、参数说明

参数src        //输入的检测图,一般为二值图,255为目标,0为背景
返回值num      //连通域数量,第一个(i=0)连通域为黑色背景
int acreage = stats.at<int>(i, CC_STAT_AREA)     //第i个连通域的面积(包含的像素点总数)
int left = stats.at<int>(i, CC_STAT_LEFT)        //第i个连通域的bbox的最左边坐标值
int top = stats.at<int>(i, CC_STAT_TOP)          //第i个连通域的bbox的最上边坐标值
int width= stats.at<int>(i, CC_STAT_WIDTH)       //第i个连通域的宽度
int height stats.at<int>(i, CC_STAT_HEIGHT)      //第i个连通域的高度
double center_x = centroids.at<double>(i, 0)     //第i个连通域的质心x坐标(col)
double center_y = centroids.at<double>(i, 1)     //第i个连通域的质心x坐标(row)

3、例子:只保留图中连通域面积较大的区域

如果我们只想保留二值图中连通域面积大于某个阈值(如100)的区域,有两种思路:

(1)在原图中将不满足条件的连通域的覆盖为黑色。

(2)将满足条件的连通域复制到一张全黑图像上。

具体实现见代码:

//筛选出面积大于100的区域,输入src,输出dst
Mat labels, stats, centroids;   
sizet num = connectedComponentsWithStats(src, labels, stats, centroids, 8, CV_16U);
vector<Vec3b> colors(num);
colors[0] = Vec3b(0, 0, 0);   //第一个连通域是黑色背景

for (sizet i = 1; i != num; i++)
{
	if (stats.at<int>(i, CC_STAT_AREA) > 100)
		colors[i] = Vec3b(255, 255, 255);     //给连通域添加颜色
	else
		colors[i] = Vec3b(0, 0, 0);
}

Mat aimArea = Mat::zeros(src.size(), CV_8UC3);    //注意需要是CV_8UC3的三通道图
for (sizet row = 0; row != src.rows; row++)
	for (sizet col = 0; col != src.cols; col++)
	{
		//获取原图中每个点的label
		sizet label = labels.at<uint16_t>(row, col);
		aimArea.at<Vec3b>(row, col) = colors[label];
	}

Mat dst;
cvtColor(aimArea , dst, COLOR_BGR2GRAY);    //转换为单通道图
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv(C++) 连通域分析函数 connectedComponentsWithStats() 用法 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐