轮廓被定义为连接所有连续点(沿边界),具有相同颜色或强度的曲线。在其他情况下,我们在二进制图像中找到轮廓,我们专注于在二进制图像中找到边界。官方定义如下:

轮廓是进行形状分析、物体检测和识别的有用工具。

为了保持准确性,我们应该使用二进制图像。首先,我们应用阈值或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

13-1.png

在上面的矩形图像中,第一张图像使用cv.CHAIN_APPROX_NONE(734)显示点,第二张图像使用cv2.CHAIN_APPROX_SIMPLE(仅4个点)显示。我们可以看到两个图像之间的差异。

标签: OpenCV, OpenCV教程, OpenCV图像识别, OpenCV安装教程, OpenCV下载, OpenCV入门, OpenCV基础, OpenCV库, OpenCV学习, OpenCV指南, OpenCV教程中文版, OpenCV快速入门, OpenCV基础教程