📜  OpenCV轮廓

📅  最后修改于: 2021-01-07 06:41:00             🧑  作者: Mango

OpenCV轮廓

轮廓定义为连接所有连续点(沿边界)的曲线,具有相同的颜色或强度。另一方面,我们在二进制图像中找到计数器,我们集中精力在二进制图像中找到边界。官方定义如下:

“轮廓”是用于形状分析以及对象检测和识别的有用工具。

为了保持准确性,我们应该使用二进制图像。首先,我们应用阈值或精巧边缘检测。

在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个点) 。我们可以看到两个图像之间的差异。