cv2.findContours()轮廓检测

轮廓检测函数cv2.findContours()

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])  

函数参数:

    image:参数是寻找轮廓的图像;
    mode:参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):
        cv2.RETR_EXTERNAL:表示只检测外轮廓
        cv2.RETR_LIST:检测的轮廓不建立等级关系
        cv2.RETR_CCOMP:建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
        cv2.RETR_TREE:建立一个等级树结构的轮廓。
    method:轮廓的近似办法:
        cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
        cv2.CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
        cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用teh-Chinl chain 近似算法

返回值:

cv2.findContours()函数返回两个值,一个是轮廓本身,还有一个是每条轮廓对应的属性。

    contour返回值:
    返回一个list,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。
    hierarchy返回值:
    返回一个ndarray,其中的元素个数和轮廓个数相同,每个轮廓 c o n t o u r s [ i ] contours[i] contours[i]对应4个hierarchy元素 h i e r a r c h y [ i ] [ 0 ]   h i e r a r c h y [ i ] [ 3 ] hierarchy[i][0] ~hierarchy[i][3] hierarchy[i][0] hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

轮廓的绘制cv2.drawContours()

OpenCV中通过cv2.drawContours在图像上绘制轮廓。

cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])  
  • image:指明在哪幅图像上绘制轮廓;
  • contours:轮廓本身,在Python中是一个list。
  • contourIdx:指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓。
  • thickness:表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。

 

cv2.drawContours(img,contours,-1,(0,0,255),3)  
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()# 为了正常关闭所有窗口

bug

ValueError: not enough values to unpack (expected 3, got 2)

OpenCV旧版,返回三个参数:

im2, contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

 OpenCV 新版调用,返回两个参数:

contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

要想返回三个参数,把OpenCV 降级成3.4.3.18 就可以了,在终端输入pip install opencv-python==3.4.3.18 

  • 13
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值