我是靠谱客的博主 可耐项链,最近开发中收集的这篇文章主要介绍OpenCV--提取轮廓findContours()函数和轮廓填充drawContours(),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
findContours函数原型
void findContours( InputOutputArray image,
//图像源,8位单通道图像。非零像素被视为1。0像素保持为0,因此图最好为二值图像,边缘检测算子处理的二值图像。如果mode等于#RETR_CCOMP或#RETR_FLOODFILL,则输入也可以是标签的32位整数图像(CV_32SC1)。
OutputArrayOfArrays contours,
//轮廓检测到的轮廓。每个轮廓都存储为一个点向量vector<vector<Point> >
OutputArray hierarchy,
//hierarchy定义为“vector<Vec4i> hierarchy”,hierarchy是一个向量;向量内每个元素都是一个包含4个int型的数组;向量hierarchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同;hierarchy内每个元素的4个int型变量,分别表示当前轮廓 i 的后一个轮廓、前一个轮廓、父轮廓和内嵌轮廓的编号索引,如果当前轮廓没有对应的后一个轮廓、前一个轮廓、内嵌轮廓和父轮廓,则相应的hierarchy[i][*]被置为-1。
int mode,
//轮廓的检索模式
int method,
//轮廓的近似方法
Point offset = Point()
//Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,并且Point还可以是负值!
);
第二个参数contours:
vector<vector<Point>> contours
,储存轮廓的位置信息,由点组成的线条或者顶点信息;
第三个参数hierarchy:
vector<Vec4i> hierarchy
,Vec4i是用于表示具有4维的向量的结构,每个值为int,分别表示当前轮廓 i 的后一个轮廓、前一个轮廓、父轮廓和内嵌轮廓的编号索引,访问方法为hierarchy[i][*]
.
第四个参数mode:
模式 | 作用 |
---|---|
RETR_EXTERNAL | 仅检索外部轮廓。它为所有的轮廓设置hierarchy[i][2]=hierarchy[i][3]=-1 |
RETR_LIST | 在不建立任何层次关系的情况下检索所有轮廓 hierarchy[i][0]=hierarchy[i][1]=hierarchy[i][2]=hierarchy[i][3]=-1 |
RETR_CCOMP | 检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层 |
RETR_TREE | 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓hierarchy[i][1]=hierarchy[i][1]=hierarchy[i][2]=hierarchy[i][3] !=-1 |
以RETR_TREE举例,下图找到4个轮廓,关系如图:
层级关系:轮廓1:
hierarchy[1][0] 表示contours[3];
hierarchy[1][1] 表示contours[0];
hierarchy[1][2] 表示contours[0];
hierarchy[1][3] 表示contours[3];
第五个参数method:
近似方法 | 作用 |
---|---|
CV_CHAIN_CODE | 用freeman链码输出轮廓contours->v_next或h_next ,其他方法输出多边形(顶点的序列) |
CV_CHAIN_APPROX_NONE | 保存物体边界上所有连续的轮廓点到contours向量内 |
CV_CHAIN_APPROX_SIMPLE | 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留 |
CV_CHAIN_APPROX_TC89_L1或CV_CHAIN_APPROX_TC89_KCOS | Ten-Chin链逼近算法中的一个 |
CV_LINK_RUNS | ,连接所有水平层次的轮廓.此方法只可与RETR_LIST 搭配使用 |
drawContours函数原型
void drawContours( InputOutputArray image, //目标图片
InputArrayOfArrays contours,//绘制轮廓需要的点集合 vector<vector<Point>>
int contourIdx, //需要绘制的轮廓序号,为负时绘制所有轮廓
const Scalar& color,//轮廓颜色
int thickness = 1, //轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内部
int lineType = LINE_8,//线型
InputArray hierarchy = noArray(),//轮廓结构信息
int maxLevel = INT_MAX, //绘制轮廓的最大级别。如果为0,则仅绘制指定的轮廓。如果为1,函数将绘制轮廓和所有嵌套轮廓。如果是2,则函数绘制轮廓、所有嵌套轮廓、所有嵌套到嵌套轮廓等。这个只有当有可用的层次结构时才考虑参数。
Point offset = Point() //点偏移量
);
最后
以上就是可耐项链为你收集整理的OpenCV--提取轮廓findContours()函数和轮廓填充drawContours()的全部内容,希望文章能够帮你解决OpenCV--提取轮廓findContours()函数和轮廓填充drawContours()所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复