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函数来取正数。

好了,根据上面的介绍,可以进行轮廓的筛选了。
首先还是上原图。
这里写图片描述
首先根据面积筛选,得到下面的结果,你可以看到,有个小圆没了
这里写图片描述

接下来根据边长筛选,得到下面的结果,为了显示的更明显些,得到下面的结果
这里写图片描述

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

	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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值