当前位置:网站首页>[opencv] image morphological operation opencv marks the positions of different connected domains
[opencv] image morphological operation opencv marks the positions of different connected domains
2022-07-07 05:12:00 【GLL_】
【opencv】 Image morphology operation -opencv Mark the location of different connected domains
/** @overload
@param image the 8-bit single-channel image to be labeled
@param labels destination labeled image
@param stats statistics output for each label, including the background label.
Statistics are accessed via stats(label, COLUMN) where COLUMN is one of
#ConnectedComponentsTypes, selecting the statistic. The data type is CV_32S.
@param centroids centroid output for each label, including the background label. Centroids are
accessed via centroids(label, 0) for x and centroids(label, 1) for y. The data type CV_64F.
@param connectivity 8 or 4 for 8-way or 4-way connectivity respectively
@param ltype output image label type. Currently CV_32S and CV_16U are supported.
*/
CV_EXPORTS_W int connectedComponentsWithStats(InputArray image, OutputArray labels,
OutputArray stats, OutputArray centroids,
int connectivity = 8, int ltype = CV_32S);
system("color F0");
Mat img = imread("D:/image/ml2.png");
if (img.empty()) {
cout << "img is empty." << endl;
return;
}
//imshow("srcImg", img);
Mat rice, riceBW;
cvtColor(img, rice, COLOR_BGR2GRAY);
imshow("rice", rice);
threshold(rice, riceBW, 50, 255, THRESH_BINARY);
imshow("riceBW", riceBW);
RNG rng(10086);
Mat out, stats, centroids;
//
int number = connectedComponentsWithStats(riceBW, out, stats, centroids, 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(rice.size(), img.type());
int w = result.cols;
int h = result.rows;
for (int i = 1; i < number; i++) {
int center_x = centroids.at<double>(i, 0);
int center_y = centroids.at<double>(i, 1);
int x = stats.at<int>(i, CC_STAT_LEFT);
int y = stats.at<int>(i, CC_STAT_TOP);
int w = stats.at<int>(i, CC_STAT_WIDTH);
int h = stats.at<int>(i, CC_STAT_HEIGHT);
int area = stats.at<int>(i, CC_STAT_AREA);
circle(img, Point(center_x, center_y), 2, Scalar(0, 255, 0), 2, 8, 0);
Rect rect(x, y, w, h);
rectangle(img, rect, colors[i], 1, 8, 0);
putText(img, 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("result:", img);
waitKey(0);
result :
边栏推荐
猜你喜欢
【Android Kotlin协程】利用CoroutineContext实现网络请求失败后重试逻辑
拿到PMP认证带来什么改变?
【opencv】图像形态学操作-opencv标记不同连通域的位置
01机器学习相关规定
Markdown编辑器
Time complexity & space complexity
01 machine learning related regulations
The sooner you understand the four rules of life, the more blessed you will be
Ansible概述和模块解释(你刚走过了今天,而扑面而来的却是昨天)
SQL injection - secondary injection and multi statement injection
随机推荐
DBSync新增对MongoDB、ES的支持
2039: [蓝桥杯2022初赛] 李白打酒加强版 (动态规划)
装饰器基础学习02
【PHP SPL笔记】
Flask project uses flask socketio exception: typeerror: function() argument 1 must be code, not str
U++ 元数据说明符 学习笔记
与利润无关的背包问题(深度优先搜索)
【Android Kotlin协程】利用CoroutineContext实现网络请求失败后重试逻辑
Understand common network i/o models
npm ERR! 400 Bad Request - PUT xxx - “devDependencies“ dep “xx“ is not a valid dependency name
Using thread class and runnable interface to realize the difference between multithreading
Leetcode longest public prefix
《四》表单
If you‘re running pod install manually, make sure flutter pub get is executed first.
【愚公系列】2022年7月 Go教学课程 005-变量
Leetcode(417)——太平洋大西洋水流问题
指针与数组在函数中输入实现逆序输出
Longest non descent subsequence (LIS) (dynamic programming)
最长公共子序列(LCS)(动态规划,递归)
Ansible概述和模块解释(你刚走过了今天,而扑面而来的却是昨天)