OpenCV轮廓

17 Mar 2025 | 阅读 2 分钟

轮廓被定义为连接所有连续点(沿着边界)的曲线,这些点具有相同的颜色或强度。 换句话说,我们在二值图像中找到轮廓,我们专注于在二值图像中找到边界。 官方定义如下

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

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

在 OpenCV 中,在二值图像中查找轮廓与从黑色背景中查找白色对象相同。

OpenCV 提供了 findContours(),用于在二值图像中查找轮廓。 语法如下

findContours () 接受三个参数,第一个参数是源图像,第二个是轮廓检索模式,第三个是轮廓近似。

让我们看下面的例子

如何绘制轮廓?

OpenCV 提供了 cv2.drawContours() 函数,该函数用于绘制轮廓。 它也可用于通过提供其边界点来绘制任何形状。 cv2.drawContours() 函数的语法如下

要在图像中绘制所有轮廓

要绘制单个轮廓,假设第 3 轮廓

第一个参数表示图像源,第二个参数表示应作为 Python 列表传递的轮廓,第三个参数用作轮廓的索引,其他参数用于颜色粗细。

轮廓近似方法

它是 cv2.findCounter() 中的第三个参数。 上面,我们已经描述了它以相同的强度绘制形状的边界。 它存储形状边界的 (x,y) 坐标。 但是这里出现了一个问题,它是否存储所有坐标? 这由轮廓近似方法指定。

如果我们传递 cv.CHAIN_APPROX_NONE,它将存储所有边界点。 有时不需要存储所有点坐标,假设我们找到了直线的轮廓,其中不需要存储所有轮廓点,只需要存储两个端点。 因此,对于这种情况,我们使用 cv.CHAIN_APPROX_NONE,它会删除所有冗余点并压缩轮廓,从而节省内存。

示例-1

OpenCV Contours

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


下一个主题OpenCV 鼠标事件