基于connectedComponentsWithStats查找图像连通域,并使用C++根据质心坐标从左上角到右下角进行排序
时间: 2024-06-12 14:07:11 浏览: 154
采用NXOpen(C++)计算体对象的质心,并对质心坐标排序
以下是基于connectedComponentsWithStats函数查找图像连通域,并使用C语言根据质心坐标从左上角到右下角进行排序的示例代码:
```c
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("test.jpg", IMREAD_GRAYSCALE);
if (img.empty())
{
printf("Failed to read image file!\n");
return -1;
}
// Find connected components
Mat labels, stats, centroids;
int n_components = connectedComponentsWithStats(img, labels, stats, centroids);
// Sort components based on centroid coordinates
for (int i = 1; i < n_components; i++) // Skip background component
{
for (int j = i + 1; j < n_components; j++)
{
if (centroids.at<Point2d>(i).y > centroids.at<Point2d>(j).y) // Sort by y-coordinate first
{
std::swap(labels, i, j);
std::swap(stats, i, j);
std::swap(centroids, i, j);
}
else if (centroids.at<Point2d>(i).y == centroids.at<Point2d>(j).y && centroids.at<Point2d>(i).x > centroids.at<Point2d>(j).x) // If y-coordinates are equal, sort by x-coordinate
{
std::swap(labels, i, j);
std::swap(stats, i, j);
std::swap(centroids, i, j);
}
}
}
// Print sorted components
for (int i = 1; i < n_components; i++) // Skip background component
{
printf("Component %d:\n", i);
printf(" Centroid: (%.2f, %.2f)\n", centroids.at<Point2d>(i).x, centroids.at<Point2d>(i).y);
printf(" Bounding box: (%d, %d, %d, %d)\n", stats.at<int>(i, CC_STAT_LEFT), stats.at<int>(i, CC_STAT_TOP), stats.at<int>(i, CC_STAT_WIDTH), stats.at<int>(i, CC_STAT_HEIGHT));
}
return 0;
}
```
该示例代码首先使用connectedComponentsWithStats函数查找图像中的连通域,并返回每个连通域的标签、统计信息和质心坐标。然后,它使用简单的选择排序算法根据质心坐标从左上角到右下角对连通域进行排序。最后,它打印出每个连通域的质心坐标和边界框信息,以验证排序的正确性。
阅读全文