当前位置:网站首页>【opencv】图像形态学操作-opencv标记不同连通域的位置
【opencv】图像形态学操作-opencv标记不同连通域的位置
2022-07-06 22:59:00 【GLL_】
【opencv】图像形态学操作-opencv标记不同连通域的位置
/** @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);
结果:
边栏推荐
- 指针与数组在函数中输入实现逆序输出
- Thread和Runnable创建线程的方式对比
- If you‘re running pod install manually, make sure flutter pub get is executed first.
- [hand torn STL] list
- Markdown editor
- Understand common network i/o models
- 【二叉树】二叉树寻路
- National meteorological data / rainfall distribution data / solar radiation data /npp net primary productivity data / vegetation coverage data
- Vscode automatically adds a semicolon and jumps to the next line
- 3.基金的类型
猜你喜欢
LabVIEW在打开一个新的引用,提示内存已满
Why do many people misunderstand technical debt
[736. LISP syntax parsing]
【问道】编译原理
A row of code r shows the table of Cox regression model
Weebly移动端网站编辑器 手机浏览新时代
【二叉树】二叉树寻路
Chapter 9 Yunji datacanvas company won the highest honor of the "fifth digital finance innovation competition"!
Dynamically generate tables
Function pointer and pointer function in C language
随机推荐
2.证券投资基金的概述
Oracle - views and sequences
vector和类拷贝构造函数
Common Oracle SQL statements
[ArcGIS tutorial] thematic map production - population density distribution map - population density analysis
How to choose an offer and what factors should be considered
Vscode automatically adds a semicolon and jumps to the next line
Inventory host list in ansible (I wish you countless flowers and romance)
史上最全学习率调整策略lr_scheduler
JDBC link Oracle reference code
JS 的 try catch finally 中 return 的执行顺序
JS variable case
The most complete learning rate adjustment strategy in history LR_ scheduler
Markdown编辑器
Read of shell internal value command
Ansible报错:“msg“: “Invalid/incorrect password: Permission denied, please try again.“
JS input and output
当 Knative 遇见 WebAssembly
STM32F103ZE+SHT30检测环境温度与湿度(IIC模拟时序)
《四》表单