#define mode_1 CV_RETR_EXTERNAL
#define mode_2 CV_RETR_LIST
#define mode_3 CV_RETR_CCOMP
#define mode_4 CV_RETR_TREE
#define method_1 CV_CHAIN_APPROX_NONE
#define method_2 CV_CHAIN_APPROX_SIMPLE
有了上一节的基础,那么就会想到,如果我想利用轮廓的特性,比如说周长或者面积来对轮廓进行筛选,那怎么做呢?
下面介绍两个函数:
- 计算轮廓面积的contourArea函数:
double contourArea(InputArray contour, bool oriented=false )
- 计算轮廓边长的arcLength函数
double arcLength(InputArray curve, bool closed)
上面两个函数的第一个参数都为:findContours提取到的第i个轮廓,即contours[i]
bool oriented=false: 表示某一个方向上轮廓的的面积值,顺时针或者逆时针,一般选择默认false;
bool closed:表示轮廓是否封闭的;
由于这里面积的算法是计算轮廓的弧线和两端点的围成的面积,所以得到的面积可能是负的,这时你可以用fabs函数来取正数。
好了,根据上面的介绍,可以进行轮廓的筛选了。
首先还是上原图。
首先根据面积筛选,得到下面的结果,你可以看到,有个小圆没了
接下来根据边长筛选,得到下面的结果,为了显示的更明显些,得到下面的结果
对了,还有个好玩的东西,假如你想把轮廓里面给填充颜色,那也是可以的,这里给出代码
if (!contours.empty() && !hierarchy.empty())
{
for (int i = 0; i < contours.size(); i++)
{
double contours_length = arcLength(contours[i], true);
cout << "arcLength函数计算的轮廓边长为:" << contours_length << endl;
if (contours_length < 200)
{
drawContours(contoursImage_length, contours, i, Scalar(255), CV_FILLED, 8, hierarchy);
}
}
}
结果如图所示:
实验源码在此:
http://download.csdn.net/download/csdn_dzh/10143002
突然意识到还有个外接矩形外接圆形的内容,那么就分到下一次再学习吧。