OpenCV中的findContours返回值hierarchy的使用

OpenCV中的findContours返回值hierarchy的使用

  • findContours会有两个返回值,contours和hierarchy
  • 如何使用hierarchy可以达到cv2.RETR_EXTERNEL一样的效果

findContours会有两个返回值,contours和hierarchy

刚开始学习opencv,在使用findContours的时候,contours用的较多,而hierarchy用的比较少。之所以关注hierarchy,是因为在用cv2.RETR_EXTERNEL的时候不能够得到自己想要的外轮廓,就想到了是不是可以用hierarchy来试一下。(虽然当时是由于二值化的时候没有用cv2.THRESH_BINARY_INV导致亮显的边界变成黑色的了)

如何使用hierarchy可以达到cv2.RETR_EXTERNEL一样的效果

直接上代码

import cv2
import random
import numpy as np

def cv_show(img,imgname):
    cv2.imshow(imgname,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread('contours.PNG')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
cv_show(thresh,'thresh')

# contours, hierarchy= cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnts = []
print(contours,'contours')
print(hierarchy,'hierarchy')
print(np.array(contours).shape)
print(np.array(hierarchy).shape)

# 用有无子轮廓来判断是外轮廓还是内轮廓
for i,cnt in enumerate(contours):
    if hierarchy[0][i][2] != -1:        # 如果层级关系中的第三个参数为-1,表示没有下一级第一个子轮廓,那么这个肯定是内轮廓,如果不为-1,则为外轮廓
        cnts.append(cnt)
contours = cnts

# 绘制轮廓
# 绘制图像,轮廓,轮廓索引,颜色模式,线条厚度
# 注意需要copy,要不原图会变。。。
draw_img = img.copy()
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)        # -1表示绘制所有轮廓
cv_show(res,'res')

解释:
hierarchy与contours的索引对应,对应每个轮廓的hierarchy有四个参数的数组,这四个参数的第三个表示有无下一级轮廓,如果为-1,则表示无下一级轮廓,那么则判断这个为外轮廓。
看看效果,如下图:
OpenCV中的findContours返回值hierarchy的使用_第1张图片

引用:
《OpenCV4快速入门》
《2021人工智能-深度学习OpenCV篇》

你可能感兴趣的:(opencv,opencv,计算机视觉,python)