一、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()

python 在图片中找到特定字符的坐标 python查找图片中的物体_python

1.只检测外层轮廓

python 在图片中找到特定字符的坐标 python查找图片中的物体_ci_02


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

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

python 在图片中找到特定字符的坐标 python查找图片中的物体_python_03


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

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

python 在图片中找到特定字符的坐标 python查找图片中的物体_python_04

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

python 在图片中找到特定字符的坐标 python查找图片中的物体_树结构_05

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

python 在图片中找到特定字符的坐标 python查找图片中的物体_树结构_06


python 在图片中找到特定字符的坐标 python查找图片中的物体_树结构_07


python 在图片中找到特定字符的坐标 python查找图片中的物体_opencv_08