4

我正在使用 OpenCVfindContours()进行 blob 查找,方法是在轮廓中的任意种子点填充并获取填充的边界矩形。然而,当两个斑点在一个角落接触时,例如

在此处输入图像描述

它们共享一个轮廓,因此只有两个 blob 中的一个会被填充,具体取决于选择的种子点。

我可以将 Floodfill 连接设置从 4 更改为 8,以便将 blob 融合在 Floodfill 中。相反,我真正想做的是忽略小缺陷,只计算大斑点。这可以在不大幅改变算法的情况下完成吗?

4

2 回答 2

2

与 Floodfill 不同的是,在 OpenCV 中无法原生使用具有 4 连接性的 findContours。

于 2013-06-11T21:30:04.893 回答
0

你应该看看findContours() 文档

findContours如果它们出现在图像中,可以返回多个轮廓,在你的情况下,如果你选择 4-connectivity,你应该得到 2 contours,然后你可以比较它们的边界框大小来决定保留哪一个。

cv::Mat img = cv::imread('test.png', 0);
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(img, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
for (size_t i = 0;i < contours.size(); ++i) {
   cv::Rect bbox = cv::boundingRect(contours[i]);
   std::cout<<"Contour"<<i<<" Area"<<bbox.area()<<std::endl;
}

希望这可以帮助。

于 2013-06-08T17:18:31.093 回答