栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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.建立一个等级树结构的所有轮廓



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/445669.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号