OpenCV——contours学习笔记(二)

#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 

有了上一节的基础,那么就会想到,如果我想利用轮廓的特性,比如说周长或者面积来对轮廓进行筛选,那怎么做呢?

下面介绍两个函数:

  1. 计算轮廓面积的contourArea函数:
double contourArea(InputArray contour, bool oriented=false )
  1. 计算轮廓边长的arcLength函数
double arcLength(InputArray curve, bool closed)

上面两个函数的第一个参数都为:findContours提取到的第i个轮廓,即contours[i]
bool oriented=false: 表示某一个方向上轮廓的的面积值,顺时针或者逆时针,一般选择默认false;
bool closed:表示轮廓是否封闭的;
由于这里面积的算法是计算轮廓的弧线和两端点的围成的面积,所以得到的面积可能是负的,这时你可以用fabs函数来取正数。

好了,根据上面的介绍,可以进行轮廓的筛选了。
首先还是上原图。
OpenCV——contours学习笔记(二)_第1张图片
首先根据面积筛选,得到下面的结果,你可以看到,有个小圆没了
OpenCV——contours学习笔记(二)_第2张图片

接下来根据边长筛选,得到下面的结果,为了显示的更明显些,得到下面的结果
OpenCV——contours学习笔记(二)_第3张图片

对了,还有个好玩的东西,假如你想把轮廓里面给填充颜色,那也是可以的,这里给出代码

	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);
			}
		}
	}

结果如图所示:
OpenCV——contours学习笔记(二)_第4张图片

实验源码在此:
http://download.csdn.net/download/csdn_dzh/10143002

突然意识到还有个外接矩形外接圆形的内容,那么就分到下一次再学习吧。

你可能感兴趣的:(OpenCV)