Opencv Python 简明教程

OpenCV Python - Image Contours

轮廓是一条连接所有沿边界具有相同颜色或强度的连续点的曲线。轮廓非常适用于形状分析和对象检测。

Find Contour

在找到轮廓之前,我们应该应用阈值或 Canny 边缘检测。然后,通过使用 findContours() 方法,我们可以在二进制图像中找到轮廓。

使用 findContours() 函数的命令如下 −

cv.findContours(image, mode, method, contours)

Parameters

findContours() 函数的参数如下 −

  1. image − 源,8 位单通道图像。

  2. mode − 轮廓检索模式。

  3. method − 轮廓逼近方法。

mode 参数的值枚举如下 −

  1. cv.RETR_EXTERNAL − 仅提取最外侧轮廓。

  2. cv.RETR_LIST − 提取所有轮廓,不建立任何层次关系。

  3. cv.RETR_CCOMP − 提取所有轮廓,并将其组织到一个两级层次结构中。

  4. cv.RETR_TREE − 提取所有轮廓,并重建嵌套轮廓的完整层次结构。

另一方面,近似方法可以是从以下方法中选取一个 −

  1. cv.CHAIN_APPROX_NONE − 存储绝对所有轮廓点。

  2. cv.CHAIN_APPROX_SIMPLE − 压缩水平、垂直和对角线线段,只保留其端点。

Draw Contour

在检测到轮廓矢量后,使用 cv.drawContours() 函数在原始图像上绘制轮廓。

cv.drawContours()函数的命令如下 −

cv.drawContours(image, contours, contourIdx, color)

Parameters

drawContours() 函数的参数如下 −

  1. image − Destination image.

  2. contours − 所有输入轮廓。每个轮廓存储为一个点矢量。

  3. contourIdx − 指示要绘制的轮廓的参数。如果为负数,则绘制所有轮廓。

  4. color − 轮廓的颜色。

Example

以下代码示例中绘制轮廓的输入图像有三个填充有黑色颜色的图形。

第一步,我们获取一个灰度图像,然后执行 Canny 边缘检测。

然后,我们在生成图像上调用 findContours() 函数。其结果是点矢量。然后,我们调用 drawContours() 函数。

完整代码如下 −

import cv2
import numpy as np

img = cv2.imread('shapes.png')
cv2.imshow('Original', img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

canny = cv2.Canny(gray, 30, 200)

contours, hierarchy = cv2.findContours(canny,
   cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
print("Number of Contours = " ,len(contours))
cv2.imshow('Canny Edges', canny)

cv2.drawContours(img, contours, -1, (0, 255, 0), 3)

cv2.imshow('Contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Output

原始图像在 Canny 边缘检测之后,以及绘制轮廓图像将显示在单独的窗口中,如下所示 −

separate windows

执行 canny edge detection 操作后,图像如下 −

canny edge detection

contours are drawn 后,图像如下所示 −

contours drawn