C++ C++;。OpenCV。计数连续数

C++ C++;。OpenCV。计数连续数,c++,opencv,C++,Opencv,我需要从我的图像中获取轮廓数(仅闭合/循环轮廓)。为此,我使用了cv::connectedComponents函数。正如文件中所说的那样 返回N,标签总数[0,N-1],其中0表示背景标签 所以要得到真正的计数单位,我只需要递减返回值(子背景轮廓)。此方法适用于我需要处理的大多数图像(实际上,它是autocad文件)。但是,我有一张图像处理不正确。此图像的返回值为4,但我们看到图像和背景上有4个圆圈。所以返回的值应该是5。 这是我遇到问题的图像: 以下是我使用的代码: void run_tes

我需要从我的图像中获取轮廓数(仅闭合/循环轮廓)。为此,我使用了
cv::connectedComponents
函数。正如文件中所说的那样

返回N,标签总数[0,N-1],其中0表示背景标签

所以要得到真正的计数单位,我只需要递减返回值(子背景轮廓)。此方法适用于我需要处理的大多数图像(实际上,它是autocad文件)。但是,我有一张图像处理不正确。此图像的返回值为4,但我们看到图像和背景上有4个圆圈。所以返回的值应该是5。 这是我遇到问题的图像:

以下是我使用的代码:

void run_test()
{
    cv::Mat img, img_edge, labels;

    img = cv::imread("G:\\test.jpg", cv::IMREAD_GRAYSCALE);
    cv::threshold(img, img_edge, 128, 255, cv::THRESH_BINARY);
    int res = cv::connectedComponents(img_edge, labels, 8, CV_16U);
}

所以我有两个问题:为什么这个图像的返回值是4(而不是5)以及(通过使用
connectedComponents
)获取轮廓数的正确方法是什么?

右下角的小圆似乎与大圆相连(每个圆的两个像素都有一个相邻的角点)。它的标签可能与大圆圈相同。还有其他方法可以找到轮廓的数量吗?你有没有尝试过用圆代替轮廓?圆的大小总是一样的吗?这真的取决于你为什么认为轮廓应该不同。事实上,两个圆都是相邻的(具有8连接性)。那你为什么认为它们不一样呢?一旦你对这个问题有了一个明确的答案,你可以考虑实施它。在不破坏其他情况下,使用4-connectivity而不是8-connectivity对你来说可能吗?