Python图片读写方式之OpenCV 物体轮廓检测

一、cv2.findContours()

用于寻找物体的轮廓。

contours,hierarchy = cv2.findContours(image, mode, method)
参数解释:
  • image:寻找轮廓的图像
  • mode:表示轮廓的检索模式
  • method:轮廓的近视办法
mode说明
cv2.RETR_EXTERNAL表示只检测外轮廓
cv2.RETR_LIST检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系
cv2.RETR_CCOMP检测所有的轮廓,但所有轮廓只建立两个等级关系
cv2.RETR_TREE检测所有轮廓,所有轮廓建立一个等级树结构
method说明
cv2.CHAIN_APPROX_NONE保存物体边界上所有连续的轮廓点到contours向量内
cv2.CHAIN_APPROX_SIMPLE仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contour向量内
返回值:
  • contours:向量内每个元素保存了一组由连续的Point点构成的点的集合的向量,每一组Point点集就是一个轮廓。有多少;轮廓,向量contours就有多少元素。
  • hierarchy:向量内每一个元素包含了4个int型变量:[后一个轮廓,前一个轮廓,父轮廓,内嵌轮廓]

二、cv2.drawContours()

用于绘制物体的轮廓。

cv2.drawContours(image,contours,contourldx,color,thickness)
参数解释
  • image:需要绘制的图像
  • contours:探测的轮廓
  • contourldx:表明要绘制轮廓的参数。如果为负,则绘制所有轮廓
  • color:绘制轮廓颜色
  • thickness:轮廓线粗细

三、实例

import cv2
import numpy as np

## 创建一个300*300图像
img = np.zeros((450,450),dtype = np.uint8)
img_ori = cv2.bitwise_not(img)
cv2.rectangle(img_ori,(20,100),(100,250),0,6)
cv2.circle(img_ori,(280,170),150,0,6)
cv2.circle(img_ori,(280,290),150,0,6)

def draw_contours(contour,ldx,color,thickness):
    img = np.ones((450,450),dtype = np.uint8)*255
    cv2.drawContours(img,contour,ldx,color,thickness)
    return img

## 1.只检测外层轮廓
contour1,hierarchy1 = cv2.findContours(img_ori,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
img_res1 = draw_contours(contour1,-1,0,3)
print("只检测外层轮廓:",hierarchy1)

## 2.不建立等级关系的所有轮廓
contour2,hierarchy2 = cv2.findContours(img_ori,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
img_res2 = draw_contours(contour2,-1,0,3)
print("不建立等级关系的所有轮廓:\n",hierarchy2)

## 3.只建立两个等级关系的所有轮廓
contour3,hierarchy3 = cv2.findContours(img_ori,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)
img_res3 = draw_contours(contour3,-1,0,3)
print("只建立两个等级关系的所有轮廓:\n",hierarchy3)

## 4.建立一个等级树结构的所有轮廓
contour4,hierarchy4 = cv2.findContours(img_ori,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
img_res4 = draw_contours(contour4,-1,0,3)
print("建立一个等级树结构的所有轮廓:\n",hierarchy4)

cv2.imshow('origin',img_ori)
cv2.imshow('res1', img_res1)
cv2.imshow('res2', img_res2)
cv2.imshow('res3', img_res3)
cv2.imshow('res4', img_res4)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

1.只检测外层轮廓

在这里插入图片描述
当只检测外层轮廓时,向量只有一个,即图片的外框,所以无前后轮廓,无等级关系,故hierarchy的四个参数都为-1。

2.不建立等级关系的所有轮廓

在这里插入图片描述
由于不建立等级,第三、第四个参数全为-1,所有轮廓一共有7个,以第一个[1 -1 -1 -1]为例说明,第一个的后一个轮廓索引编号(从0开始)为1,无前一个轮廓,故第一个参数为1,第二个参数为-1。

3.只建立两个等级关系的所有轮廓

在这里插入图片描述

只建立两个等级关系的所有轮廓指所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层。下面以颜色表示轮廓:黑色⊆紫色⊆红色。所以顶层的元素有4个黑色轮廓和1个红色轮廓,而红色轮廓有两个内嵌轮廓(紫色)。
在这里插入图片描述

4.建立一个等级树结构的所有轮廓

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值