这是我消除小轮廓的解决方案。基本思想是检查每个轮廓的长度/面积,然后从矢量容器中删除较小的轮廓。
通常你会得到这样的轮廓
Mat canny_output; //example from OpenCV Tutorial
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Canny(src_img, canny_output, thresh, thresh*2, 3);//with or without, explained later.
findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0,0));
通过 Canny() 预处理,您将获得轮廓段,但是每个段都与边界像素一起存储为闭合环。在这种情况下,您可以检查长度并删除较小的,例如
for (vector<vector<Point> >::iterator it = contours.begin(); it!=contours.end(); )
{
if (it->size()<contour_length_threshold)
it=contours.erase(it);
else
++it;
}
如果没有 Canny() 预处理,您将获得对象的轮廓。类似的,你也可以使用面积来定义一个阈值来消除小物体,如 OpenCV 教程所示
vector<Point> contour = contours[i];
double area0 = contourArea(contour);
此 contourArea() 是非零像素的数量