OpenCV教程-OpenCV轮廓
轮廓被定义为连接所有连续点(沿边界),具有相同颜色或强度的曲线。在其他情况下,我们在二进制图像中找到轮廓,我们专注于在二进制图像中找到边界。官方定义如下:
轮廓是进行形状分析、物体检测和识别的有用工具。
为了保持准确性,我们应该使用二进制图像。首先,我们应用阈值或Canny边缘检测。
在OpenCV中,在二进制图像中找到轮廓与从黑色背景中找到白色对象相同。
OpenCV提供了findContours(),用于在二进制图像中找到轮廓。语法如下:
cv2. findContours (thes, cv2.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
findContours()接受三个参数,第一个参数是源图像,第二个是轮廓检索模式,第三个是轮廓近似。
让我们考虑以下示例:
import numpy as np
import cv2 as cv
im = cv.imread(r'C:\Users\DEVANSH SHARMA\binary.png')
imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
如何绘制轮廓?
OpenCV提供了cv2.drawContours()函数,用于绘制轮廓。它还用于通过提供其边界点来绘制任何形状。cv2.drawContours()函数的语法如下:
要在图像中绘制所有轮廓:
cv2.drawCounter(img, contours,-1, (0,255,0),3)
要绘制单个轮廓,假设为第3个轮廓:
cnt = contours[3]
cv2.drawCounter(img,[cnt],0,(0,255,0),3)
第一个参数表示图像源,第二个参数表示应传递为Python列表的轮廓,第三个参数用作轮廓的索引,其他参数用于颜色厚度。
轮廓近似方法
这是cv2.findContours()的第三个参数。上面,我们已经将其描述为使用相同强度绘制形状的边界。它存储形状的边界的(x, y)坐标。但是这里有个问题,它是否存储所有坐标?这由轮廓近似方法指定。
如果我们传递cv.CHAIN_APPROX_NONE,它将存储所有的边界点。有时候不需要存储所有的点坐标,假设我们找到了一条直线的轮廓,那么就不需要存储所有轮廓点,只需要两个端点。因此,对于这种情况,我们使用cv.CHAIN_APPROX_NONE,它会删除所有多余的点并压缩轮廓,从而节省内存。
示例-1
在上面的矩形图像中,第一张图像使用cv.CHAIN_APPROX_NONE(734)显示点,第二张图像使用cv2.CHAIN_APPROX_SIMPLE(仅4个点)显示。我们可以看到两个图像之间的差异。