OpenCV中findContours轮廓提取一个边缘只对应的一个轮廓
来源:互联网 发布:centos 7服务器dvd安装 编辑:程序博客网 时间:2024/06/06 00:43
OpenCV中findContours轮廓提取一个边缘只对应的一个轮廓
众所周知,图像查找轮廓可以用findContours函数解决,但是不知道大家发现一个问题没有,有时候输入图像,得到的结果会出现图像中一条边缘有查找到两个轮廓。当然只提取最外轮廓是不会出现重复情况,但设置提取所有轮廓会出现两个轮廓,对于利用得到的轮廓进一步处理带来不必要的麻烦。现在网上很多讲解findContours()函数都是讲解参数的,当真的用到这个函数会发现跟自己的结果并不如意。下面我就以我有限的感悟谈一下如何利用findContours()得到一条边缘得到对应的一个轮廓,当然不会去修改这个函数的代码。
findContours()函数参数讲解
- 输入image;
- 输出contours,是二维向量的Point。如:vector< vector>contours;
- hierarchy;每个轮廓的信息,后面要用到这些重要信息。
- mode;轮廓检索模式,网上很多参数说明。
- method;轮廓的近似办法。
- offset;我没用过,直接默认参数。
提取一个边缘只对应的一个轮廓
这里说一下mode这个参数。
RETR_EXTERNAL:表示只检测最外层轮廓,意思是图像中独立的个体只检测最外层轮廓,包含在里面的轮廓不会提取出来。
RETR_LIST:提取所有轮廓,并放置在list中,不建立等级关系。意思就是提取出来的轮廓之间是没有联系的。
RETR_CCOMP:提取所有轮廓,并且将其组织为双边结构。意思就是第一层为它的外围轮廓,第二层为内围轮廓,利用这个参数可以筛选出来一个独立边缘只对应一个轮廓。
RETR_TREE:提取所有轮廓,并且重新建立网状轮廓结构。它体现出来的轮廓联系很紧密,比如说一个轮廓在另外一个轮廓的里面,轮廓里面又包含轮廓。
对了,在参数method中有个标识符–CV_CHAIN_CODE,是生成Freeman码的,但是OpenCV提供的C++接口好像不好提取,还没有深究,C接口的代码我有,网上荡的,在百度知道搜的,那不缺大神哦。
前面讲了那么多,进入正题吧。其实所有的轮廓关系在参数hierarchy中体现,大家可以调试看看那里面的值。hierarchy[i][0]–hierarchy[i][3]依次表示轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓,如果没有对应项,设置为-1。
我们要得到一个边缘只对应的一个轮廓,需要在mode参数设置为RETR_CCOMP,表示双层结构,利用hierarchy中的信息筛选出轮廓。
如下图,其实只有四个轮廓,但查找出来了七个轮廓。
hierarchy信息中对应的 值
由上表可以发现,每个hierarchy[i][0]对应的值指示下一个轮廓,注意,这里下一个轮廓指的是另外的轮廓,不是同一个边缘的另外一个轮廓。所以我们利用这个信息可以筛选出一个边缘的一条轮廓,分别是0->2->4->6四条轮廓。
贴一下代码:
vector<int>Index;for(int i=0;i<contours.size();){ int next=hierarchy[i][0]; Index.push_back(i); i=next; if(i==-1) break;}
输出的结果Index为(0,2,4,6)。
总结
需要用得到的轮廓做下一步处理可以使用这个方法免去多余的运算。其实也不算是方法,也就是自己一点点感悟吧,毕竟我自己也是学习者,还有很多不懂得地方。希望我这点感悟对您有所帮助,写的不对的地方还望见谅,谢谢!
- OpenCV中findContours轮廓提取一个边缘只对应的一个轮廓
- 使用OpenCV的函数findContours提取轮廓并绘制轮廓
- [转]opencv轮廓提取(findcontours函数详解)
- OPENCV轮廓提取findContours和drawContours
- OPENCV轮廓提取findContours和drawContours
- opencv floodfill与findContours结合提取轮廓
- OPENCV轮廓提取findContours和drawContours
- cvFindContours/findContours提取轮廓
- cvFindContours/findContours提取轮廓
- opencv 轮廓查找 findContours
- 利用OpenCV的findContours作轮廓检测
- OpenCV中findContours查找后获得轮廓数 轮廓包含点数 各点坐标的实践
- OpenCV轮廓、边缘、边界的相关函数cv::findContours()等
- EmguCV提取轮廓的一个例子
- 基于opencv,设置findcontours参数减提取中间轮廓
- 提取轮廓在OpenCV里有一个函数 cvFindContours
- OpenCV轮廓、边缘、边界的相关函数
- findContours轮廓提取函数与drawContours轮廓绘制函数的使用
- Injectable、Promise、Interface、使用服务
- 欢迎使用CSDN-markdown编辑器
- node.js之基本流处理模块stream
- Structural directives、再谈组件生命周期
- Qt/QML开发支持下载的简单浏览器
- OpenCV中findContours轮廓提取一个边缘只对应的一个轮廓
- mysql limit用法
- 获取时间戳
- 假后看这个问的blog
- Linux下redis安装
- P1002 过河卒
- Codeforces Gym 100623H Problem H. Holes
- 【HDU4352】XHXJ's LIS 数位DP
- Spring学习-15:Spring整合Junit