这是我的消除小轮廓的解决方案。 其基本思想是检查每个轮廓的长度/面积,然后从矢量容器中删除较小的一个。
通常你会得到这样
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;
}
没有坎尼()预处理,你会得到对象的轮廓。 相似,也可以使用区域来定义阈值,以消除小物件,如)所示
vector<Point> contour = contours[i];
double area0 = contourArea(contour);
此contourArea(OpenCV的教程是非零的像素数
感谢您的建议,但我没有得到如何编写代码来查找已检测到的每个斑点/轮廓的区域。我写的代码在以下链接中。你能否纠正它并回复。 :http://textuploader.com/?p=6&id=YwRl。 – 2012-04-20 02:16:39
哦!我只是忘了,cvutility的头文件和cpp文件可以在这些链接中找到:http://textuploader.com/?p = 6&id = Dtnvj http://textuploader.com/?p=6&id=TSlRQ请将它们包含在源目录和包含路径。 – 2012-04-20 02:28:55
我对C api不太熟悉,但看起来你只是计算第一个轮廓的面积。您需要遍历轮廓,并只绘制区域大于某个阈值的轮廓。如果你只是想找到一个物体,你应该绘制最大面积的轮廓。 – fferen 2012-04-20 03:09:34