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)
绘制一个个体的轮廓,假设是第三个计数器
cnt = contours[3]
cv2.drawCounter(img,[cnt],0,(0,255,0),3)
第一个参数表示图像源,第二个参数表示应作为Python列表传递的轮廓,第三个参数用作轮廓的索引,其他参数用于颜色厚度。
轮廓近似方法
它是cv2.findCounter()中的第三个参数。上面我们已经将其描述为用相同强度绘制形状的边界。它存储形状边界的(x,y)坐标。但是这里出现的问题是它是否存储了所有坐标?这由轮廓近似方法来指定。
如果我们传递cv.CHAIN_APPROX_NONE,它将存储所有边界点。有时不需要存储所有点的坐标,假设我们找到了一条直线的轮廓,不需要存储所有轮廓点,只需要存储两个端点。因此对于这种情况,我们使用cv.CHAIN_APPROX_NONE,它会删除所有冗余点并压缩轮廓,从而节省内存。
示例1
在上面的矩形图像中,第一张图像显示了使用 cv.CHAIN_APPROX_NONE(734) 的点, 而第二张图像显示了使用 cv2.CHAIN_APPROX_SIMPLE(仅有4个点) 的点。我们可以看到两张图像之间的差异。