OpenCV连通域怎么对数量统计,代码是什么
Admin 2022-08-12 群英技术资讯 520 次浏览
1.输入图像为分割结果图像
2.根据种子填充法思路,遍历图像,得到每个连通域外接矩形坐标信息、面积信息
/* Input: src: 待检测连通域的二值化图像 Output: dst: 标记后的图像 featherList: 连通域特征的清单(可自行查阅文档) return: 连通域数量。 */ int connectionDetect(Mat &src, Mat &dst, vector<Feather> &featherList) { int rows = src.rows; int cols = src.cols; int labelValue = 0; Point seed, neighbor; stack<Point> pointStack; // 用于计算连通域的面积 int area = 0; // 连通域的左边界,即外接最小矩形的左边框,横坐标值,依此类推 int leftBoundary = 0; int rightBoundary = 0; int topBoundary = 0; int bottomBoundary = 0; // 外接矩形框 Rect box; Feather feather; vector<stack<Point>> points; featherList.clear(); dst.release(); dst = src.clone(); for (int i = 0; i < rows; i++) { uchar *pRow = dst.ptr<uchar>(i); for (int j = 0; j < cols; j++) { if (pRow[j] == 255) { area = 0; // labelValue最大为254,最小为1. labelValue++; // Point(横坐标,纵坐标) seed = Point(j, i); dst.at<uchar>(seed) = labelValue; pointStack.push(seed); area++; leftBoundary = seed.x; rightBoundary = seed.x; topBoundary = seed.y; bottomBoundary = seed.y; while (!pointStack.empty()) { neighbor = Point(seed.x + 1, seed.y); if ((seed.x != (cols - 1)) && (dst.at<uchar>(neighbor) == 255)) { dst.at<uchar>(neighbor) = labelValue; pointStack.push(neighbor); area++; if (rightBoundary < neighbor.x) rightBoundary = neighbor.x; } neighbor = Point(seed.x, seed.y + 1); if ((seed.y != (rows - 1)) && (dst.at<uchar>(neighbor) == 255)) { dst.at<uchar>(neighbor) = labelValue; pointStack.push(neighbor); area++; if (bottomBoundary < neighbor.y) bottomBoundary = neighbor.y; } neighbor = Point(seed.x - 1, seed.y); if ((seed.x != 0) && (dst.at<uchar>(neighbor) == 255)) { dst.at<uchar>(neighbor) = labelValue; pointStack.push(neighbor); area++; if (leftBoundary > neighbor.x) leftBoundary = neighbor.x; } neighbor = Point(seed.x, seed.y - 1); if ((seed.y != 0) && (dst.at<uchar>(neighbor) == 255)) { dst.at<uchar>(neighbor) = labelValue; pointStack.push(neighbor); area++; if (topBoundary > neighbor.y) topBoundary = neighbor.y; } seed = pointStack.top(); pointStack.pop(); } box = Rect(leftBoundary, topBoundary, rightBoundary - leftBoundary, bottomBoundary - topBoundary); feather.area = area; feather.boundingbox = box; feather.label = labelValue; featherList.push_back(feather); } } } return labelValue; }
<font color=#999AAA >在此不进行实例演示
1、 输入图像为分割后图像
2、 执行结果可根据featherList信息自行绘制矩形框
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章给大家分享的是Python time库的使用,time库运行访问多种类型的时钟,这些时钟用于不同的场景,下文介绍了time库获取各种时钟 ,及获取并计算时间的函数使用等等,小编觉得挺实用的,因此分享给大家做个参考,文中示例代码介绍的非常详细,感兴趣的朋友接下来一起跟随小编看看吧。
thon多线程实现多任务怎样做?首先,我们需要了解什么是线程、 一个程序实现多任务的方法、多线程的创建方式等等,接下来我们就一步步的了解python多线程实现多任务的方法吧。
本文详细讲解了Django框架中模板的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
本章节将一些Python3基础语法整理成手册,方便各位在日常使用和学习是查阅,包含了编码、标识符、保留字、注释、缩进、字符串等常用内容。
这篇文章主要介绍了Python写一个简单上课点名系统,文章围绕Python得性概念资料写一个简的得上课点名系统,并附上详细的代码即过程总结,需要的朋友可以参考一下,希望对你有所帮助
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008