Opencv Python 简明教程
OpenCV Python - Image Contours
轮廓是一条连接所有沿边界具有相同颜色或强度的连续点的曲线。轮廓非常适用于形状分析和对象检测。
Find Contour
在找到轮廓之前,我们应该应用阈值或 Canny 边缘检测。然后,通过使用 findContours() 方法,我们可以在二进制图像中找到轮廓。
使用 findContours() 函数的命令如下 −
cv.findContours(image, mode, method, contours)
Parameters
findContours() 函数的参数如下 −
-
image − 源,8 位单通道图像。
-
mode − 轮廓检索模式。
-
method − 轮廓逼近方法。
mode 参数的值枚举如下 −
-
cv.RETR_EXTERNAL − 仅提取最外侧轮廓。
-
cv.RETR_LIST − 提取所有轮廓,不建立任何层次关系。
-
cv.RETR_CCOMP − 提取所有轮廓,并将其组织到一个两级层次结构中。
-
cv.RETR_TREE − 提取所有轮廓,并重建嵌套轮廓的完整层次结构。
另一方面,近似方法可以是从以下方法中选取一个 −
-
cv.CHAIN_APPROX_NONE − 存储绝对所有轮廓点。
-
cv.CHAIN_APPROX_SIMPLE − 压缩水平、垂直和对角线线段,只保留其端点。
Draw Contour
在检测到轮廓矢量后,使用 cv.drawContours() 函数在原始图像上绘制轮廓。
cv.drawContours()函数的命令如下 −
cv.drawContours(image, contours, contourIdx, color)
Parameters
drawContours() 函数的参数如下 −
-
image − Destination image.
-
contours − 所有输入轮廓。每个轮廓存储为一个点矢量。
-
contourIdx − 指示要绘制的轮廓的参数。如果为负数,则绘制所有轮廓。
-
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()