OpenCV学习笔记(23)findContours与drawContours
来源:互联网 发布:w7内外网转换软件 编辑:程序博客网 时间:2024/06/06 01:58
findContours函数,这个函数的原型为:
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())
contours参数为检测的轮廓数组,每一个轮廓用一个point类型的vector表示;
CV_RETR_LIST检测的轮廓不建立等级关系;
CV_RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层;
CV_CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1;
CV_CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息;
findContours后会对输入的2值图像改变,所以如果不想改变该2值图像,需创建新mat来存放,findContours后的轮廓信息contours可能过于复杂不平滑,可以用approxPolyDP函数对该多边形曲线做适当近似。
contourArea函数可以得到当前轮廓包含区域的大小,方便轮廓的筛选。
还可以得到轮廓的外包络矩形,使用函数boundingRect,如果想得到旋转的外包络矩形,使用函数minAreaRect,返回值为RotatedRect;也可以得到轮廓的外包络圆,对应的函数为minEnclosingCircle;想得到轮廓的外包络椭圆,对应的函数为fitEllipse,返回值也是RotatedRect,可以用ellipse函数画出对应的椭圆。
如果想根据多边形的轮廓信息得到多边形的多阶矩,可以使用类moments,这个类可以得到多边形和光栅形状的3阶以内的所有矩,类内有变量m00,m10,m01,m20,m11,m02,m30,m21,m12,m03,比如多边形的质心为 x = m10 / m00,y = m01 / m00。
如果想获得一点与多边形封闭轮廓的信息,可以调用pointPolygonTest函数,这个函数返回值为该点距离轮廓最近边界的距离,为正值为在轮廓内部,负值为在轮廓外部,0表示在边界上。
转自:http://blog.sina.com.cn/s/blog_662c78590100z0rg.html
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())
参数说明
输入图像image必须为一个2值单通道图像;contours参数为检测的轮廓数组,每一个轮廓用一个point类型的vector表示;
hiararchy参数和轮廓个数相同,每个轮廓contours[ i ]对应4个hierarchy元素hierarchy[ i ][ 0 ] ~hierarchy[ i ][ 3 ],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,该值设置为负数。
mode表示轮廓的检索模式:
CV_RETR_EXTERNAL表示只检测外轮廓;CV_RETR_LIST检测的轮廓不建立等级关系;
CV_RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层;
CV_RETR_TREE建立一个等级树结构的轮廓。
CV_CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1;
CV_CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息;
CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法。
findContours后会对输入的2值图像改变,所以如果不想改变该2值图像,需创建新mat来存放,findContours后的轮廓信息contours可能过于复杂不平滑,可以用approxPolyDP函数对该多边形曲线做适当近似。
contourArea函数可以得到当前轮廓包含区域的大小,方便轮廓的筛选。
findContours经常与drawContours配合使用,用来将轮廓绘制出来。
其中第一个参数image表示目标图像,第二个参数contours表示输入的轮廓组,每一组轮廓由点vector构成,第三个参数contourIdx指明画第几个轮廓,如果该参数为负值,则画全部轮廓,第四个参数color为轮廓的颜色,第五个参数thickness为轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内部,第六个参数lineType为线型,第七个参数为轮廓结构信息,第八个参数为maxLevel。
得到了复杂轮廓往往不适合特征的检测,这里再介绍一个点集凸包络的提取函数convexHull,输入参数就可以是contours组中的一个轮廓,返回外凸包络的点集。还可以得到轮廓的外包络矩形,使用函数boundingRect,如果想得到旋转的外包络矩形,使用函数minAreaRect,返回值为RotatedRect;也可以得到轮廓的外包络圆,对应的函数为minEnclosingCircle;想得到轮廓的外包络椭圆,对应的函数为fitEllipse,返回值也是RotatedRect,可以用ellipse函数画出对应的椭圆。
如果想根据多边形的轮廓信息得到多边形的多阶矩,可以使用类moments,这个类可以得到多边形和光栅形状的3阶以内的所有矩,类内有变量m00,m10,m01,m20,m11,m02,m30,m21,m12,m03,比如多边形的质心为 x = m10 / m00,y = m01 / m00。
如果想获得一点与多边形封闭轮廓的信息,可以调用pointPolygonTest函数,这个函数返回值为该点距离轮廓最近边界的距离,为正值为在轮廓内部,负值为在轮廓外部,0表示在边界上。
转自:http://blog.sina.com.cn/s/blog_662c78590100z0rg.html
阅读全文
0 0
- OpenCV学习笔记(23)findContours与drawContours
- OpenCV Tutorial: 輪廓(findContours、drawContours)
- opencv findContours和drawContours使用方法
- OPENCV轮廓提取findContours和drawContours
- opencv中findContours 和drawContours画图函数
- OPENCV轮廓提取findContours和drawContours
- OPENCV轮廓提取findContours和drawContours
- findContours && drawContours
- 轮廓提取--findContours()和drawContours()
- 輪廓(findContours、drawContours)
- 取轮廓的集合findContours与DrawContours的关系
- OpenCV示例学习笔记(1)-contours2.cpp-通过findContours 函数实现轮廓提取
- 【OpenCV学习笔记】之一: reduce() 和 findContours()的使用陷阱
- findContours和drawContours的使用
- 【OpenCV3】图像轮廓查找与绘制——cv::findContours()与cv::drawContours()详解
- findContours轮廓提取函数与drawContours轮廓绘制函数的使用
- 提取图像轮廓--findContours函数、drawContours函数
- Opencv笔记——findContours函数
- phpcms v9网站搬家更换域名的方法
- VS调试网站时分析器错误
- 059、060、061-C++
- mac效率工具之moom
- [Leetcode] 198. House Robber 解题报告
- OpenCV学习笔记(23)findContours与drawContours
- java中通过反射获取成员方法并使用
- Ubuntu 14.04 LTS 安装 Virtualenvwrapper
- 使用环信出现的问题
- 单项链表的实现
- HashMap源代码分析
- Python集合基本用法
- latex使用小记录
- app集成微信支付服务器端开发(java)