在计算机视觉领域,轮廓检测是一项核心且基础的技术,它能够帮助我们识别图像中物体的边界形状,为后续的目标识别、图像分割、尺寸测量等高级任务提供关键支撑。本文将基于 OpenCV 库,从理论知识到代码实战,全面讲解轮廓检测的原理、API 使用方法以及常见应用场景,即使是 OpenCV 初学者也能轻松理解并上手实践。
一、轮廓检测基础概念
在正式进入代码实战前,我们需要先明确几个核心概念,这是理解后续内容的关键:
- 轮廓(Contour):指图像中具有相同颜色或灰度的连续像素点所构成的曲线,它代表了物体的边界形状。简单来说,轮廓就是物体边缘的 “骨架”。
- 二值图像要求:轮廓检测对输入图像有严格要求 —— 必须是二值图像(像素值仅为 0 和 255,分别代表背景和前景)。这是因为轮廓检测需要明确区分物体和背景,灰度图像或彩色图像的像素值范围过广,无法直接用于轮廓提取。
- 轮廓层次(Hierarchy):当图像中存在嵌套物体(如 “画框里的画”“空心圆内部的小圆”)时,轮廓之间会形成层级关系。OpenCV 通过层次结构数组记录这种关系,帮助我们区分 “父轮廓”(外轮廓)和 “子轮廓”(内轮廓)。
二、核心 API 解析:cv2.findContours ()
轮廓检测的核心函数是cv2.findContours(),它负责从二值图像中提取所有轮廓及其层次结构。掌握该函数的参数和返回值,是实现轮廓检测的第一步。
1. 函数语法
image, contours, hierarchy = cv2.findContours(img, mode, method)
2. 参数详解
(1)输入图像:img
- 必须是二值图像(通过阈值处理、边缘检测等方法得到),而非彩色图像或灰度图像。
- 若输入为彩色 / 灰度图像,需先通过
cv2.threshold()等函数转换为二值图像(后续实战会演示)。
(2)轮廓检索模式:mode
该参数决定了 OpenCV 如何提取轮廓以及是否建立轮廓间的层级关系,常用的 4 种模式如下:
| 模式常量 | 功能描述 |
|---|---|
cv2.RETR_EXTERNAL |
只检测外轮廓,忽略所有子轮廓(适合只关注最外层物体的场景,如 “检测桌面的杯子”)。 |
cv2.RETR_LIST |
检测所有轮廓,但不建立层级关系,所有轮廓平级(适合无需区分内外轮廓的简单场景)。 |
cv2.RETR_CCOMP |
检测所有轮廓,仅建立两级层级:第 1 级为外轮廓,第 2 级为外轮廓内部的空洞轮廓(适合简单嵌套场景)。 |
cv2.RETR_TREE |
检测所有轮廓,建立完整的层级结构(适合复杂嵌套场景,如 “俄罗斯套娃” 式的多层轮廓)。 |
(3)轮廓近似方法:method
该参数决定了如何压缩轮廓上的点,以平衡轮廓精度和存储效率:
| 方法常量 | 功能描述 |
|---|---|
cv2.CHAIN_APPROX_NONE |
存储轮廓上所有像素点(精度最高,但占用内存大, |
OpenCV轮廓检测全解析

最低0.47元/天 解锁文章
5770

被折叠的 条评论
为什么被折叠?



