您的位置:首页 > 运维架构

opencv2中寻找轮廓

2016-05-14 23:46 369 查看
最近想尝试用opencv做项目,发现需要考虑的细节很多,用商业库用习惯了,有点不适应,慢慢来吧。

上网查了查用opencv做连通域运算,发现都是先寻找轮廓,那就先来学习下轮廓。

opencv中寻找轮廓的c++函数是

void findContours(InputOutputArray image,
OutputArrayOfArrays contours, OutputArray hierarchy, int mode,
int method, Point offset=Point()),总共6个参数:

1、InputOutputArray image:源图像,8bit单通道,非0像素认为是1。

2、OutputArrayOfArrays contours:检测到的轮廓,每个轮廓以点矢量保存。

3、OutputArray hierarchy:可选的输出矢量,保存轮廓的拓扑结构。它的元素个数等于轮廓个数。对于每一个轮廓contour[i],hierarchy[i][0]对应于同层级下一个轮廓索引 , hiearchy[i][1]对应于同层级前一个轮廓的索引 , hiearchy[i][2]对应于第一个子轮廓索引 ,hiearchy[i][3]对应于父轮廓的索引。如果contour[i]没有父轮廓,那么hiearchy[3]为负,hiearchy[0~2]一样。

4、int mode:轮廓检索模式。

CV_RETR_EXTERNAL:只检索最外的轮廓。即内部子轮廓不检测。

CV_RETR_LIST:检索所有轮廓,但是不建立层级关系hierarchy。

CV_RETR_CCOMP:检索所有轮廓,组织为2级hierarchy。

CV_RETR_TREE:检索所有轮廓,并组织为树状,包括所有层级(hierarchy)。

示意图来自《学习opencv》



图1 黑背景白前景

图中最大的轮廓为c0,其内部包括两个孔洞h00,h01,孔洞内部又包括子轮廓和子孔洞c000,c010等,那么对应的四种mode如下图



图2
4中Mode模式

5、int method:轮廓近似模式。有三个可选项
CV_CHAIN_APPROX_NONE:存储几乎所有的轮廓点。

CV_CHAIN_APPROX_SIMPLE:压缩轮廓,只保存水平、垂直、倾斜部分的端点,也就是只保存角点。

CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:Teh-Chin链码近似算法,用到的时候在学吧。
6:、Point offset:可选项,表示每个轮廓点的偏移量。当使用ROI时,可以保持得到的轮廓点坐标和图像坐标系一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: