我正在使用 OpenCVfindContours()
进行 blob 查找,方法是在轮廓中的任意种子点填充并获取填充的边界矩形。然而,当两个斑点在一个角落接触时,例如
它们共享一个轮廓,因此只有两个 blob 中的一个会被填充,具体取决于选择的种子点。
我可以将 Floodfill 连接设置从 4 更改为 8,以便将 blob 融合在 Floodfill 中。相反,我真正想做的是忽略小缺陷,只计算大斑点。这可以在不大幅改变算法的情况下完成吗?
我正在使用 OpenCVfindContours()
进行 blob 查找,方法是在轮廓中的任意种子点填充并获取填充的边界矩形。然而,当两个斑点在一个角落接触时,例如
它们共享一个轮廓,因此只有两个 blob 中的一个会被填充,具体取决于选择的种子点。
我可以将 Floodfill 连接设置从 4 更改为 8,以便将 blob 融合在 Floodfill 中。相反,我真正想做的是忽略小缺陷,只计算大斑点。这可以在不大幅改变算法的情况下完成吗?
与 Floodfill 不同的是,在 OpenCV 中无法原生使用具有 4 连接性的 findContours。
你应该看看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;
}
希望这可以帮助。