检索图形周多边形

这个功能一般用在检索mask图形区域的周边多边形。findContours函数是opencv中很基本的一个函数。此外将对其应用做简要介绍。

检索高亮区块

findContours函数一般都检索高亮像素块的边界。例如下图所示:

此图中,从左到右依次是:原图,灰度图,阈值取反分割图,周边多边形图。图中数字部分高亮的时候,就会被检测成边界。这相当于在对图做threshold运算时采用了TRESH_BINARY_INV运算。

这个示例是为了提示我们,在应用cv2.findContours函数时,要让感兴趣的部分高亮显示。如果反过来,让背景高亮,内容黑暗(白板黑子)则会发生错误。如下图所示:

函数原型

findContours函数的原型如下:


void cv::findContours	(	
  InputArray 	image,
  OutputArrayOfArrays 	contours,
  OutputArray 	hierarchy,
  int 	mode,
  int 	method,
  Point 	offset = Point() 
)		

其中输入参数image是一般的图形对象,contours是检索出来的周边多边形。结构一般为这样的一个数组:[[[x00,y00], [x01,y01], ...],[[x10,y10],[x11,y11],...], ...],数组中0轴上,每一个对象都是一个封闭的多边形。

hierarchy指的是contours中多边形的层次关系。其数据结构为这样一个数组[[next0, previous0, child0, parent0], [next1, previous1, child1, parent1], ...]。这里的next, previous, child, parent都是整数类型,用来指示contours对应的多边形序号。next和previous指的的多边形的顺序关系,child, parent指的是包含与被包含的关系。

函数中mode的值,影响了识别多边形的结构组成方式。mode的取值有如下几种情况:

cv.RETR_TREE,这种情况会检索出所有的区块边界多边形,并对区块的包含与被包含形成树形结构。

cv.RETR_EXTERNAL, 这种情况只检索各区块的最外侧边界多边形。因此在hierarchy中不会形成child, parent的结构,并且在cv.RETR_TREE中能找出的所有parnet不为-1的多边形在cv.RETR_EXTERNAL的情况下都不会被检测出来

cv.RETR_CCOMP, 这种情况下检索算法也会像cv.RETR_TREE一样检索出所有的边界多边形。不同的是,它不会形成树形结构,而只会形成两层结构。在第一层里面只会有最外层多边形,第二层都是第一层中出现多边形的第一个内层多边形。如果在第二层中还有嵌套多边形,则此多边形会归入第一层中。

method参数用来指示检索边界时采用的算法,method可能取cv.CHAIN_APPROX_NONE, cv.CHAIN_APPROX_SIMPLE。前者不会对检测出来的多边形做任何的简化或者说近似的计算。而后者会对检测出来的多边形做简化运算,例如检测出来的一个像素区块时正方形时,前者的多边形可能会包含这个正方形周长上面经过的所有像素点,而后者的多边形可能就只有多边形4个角的顶点。

发表评论

邮箱地址不会被公开。 必填项已用*标注