C++,计算连通域的质心点,获得种子(connectedComponentsWithStats)
时间: 2023-07-15 09:13:47 浏览: 148
采用NXOpen(C++)计算体对象的质心,并对质心坐标排序
在 OpenCV 中,可以使用 `connectedComponentsWithStats` 函数计算图像的连通域,并获得每个连通域的一些统计信息,包括质心坐标。以下是使用该函数计算连通域质心点和获得种子的示例代码:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat src = imread("test.png", IMREAD_GRAYSCALE);
if (src.empty())
{
std::cout << "Failed to read image!" << std::endl;
return -1;
}
// 二值化
Mat binary;
threshold(src, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
// 计算连通域
Mat labels, stats, centroids;
int num_labels = connectedComponentsWithStats(binary, labels, stats, centroids);
// 输出连通域数目
std::cout << "Number of labels: " << num_labels - 1 << std::endl;
// 显示连通域质心点和种子
Mat dst;
cvtColor(src, dst, COLOR_GRAY2BGR);
for (int i = 1; i < num_labels; ++i)
{
Point center(static_cast<int>(centroids.at<double>(i, 0)),
static_cast<int>(centroids.at<double>(i, 1)));
circle(dst, center, 3, Scalar(0, 0, 255), -1);
Point seed(static_cast<int>(centroids.at<double>(i, 0)),
static_cast<int>(centroids.at<double>(i, 1)));
floodFill(dst, seed, Scalar(0, 255, 0));
}
// 显示结果
imshow("Result", dst);
waitKey();
return 0;
}
```
以上代码中,首先读入原始图像并二值化,然后调用 `connectedComponentsWithStats` 函数计算连通域和统计信息。最后,遍历每个连通域,分别绘制质心点和种子,最终将结果显示出来。需要注意的是,由于 OpenCV 中的坐标系是以左上角为原点的,因此在获取质心坐标时,需要将 x 和 y 坐标交换。
阅读全文