在计算机视觉领域,轮廓检测是图像分析的核心技术之一,广泛应用于物体识别、形状分析、目标分割等场景。本文将从基础到进阶,结合手机、鲜花两类实战案例,系统讲解 OpenCV 中图像边缘处理、轮廓提取、轮廓筛选及近似轮廓拟合的完整流程,帮助大家掌握从原理到落地的核心技巧。
一、核心知识点
在开始写代码之前我们要先明确几个核心概念:
- 轮廓:图像中连续的、具有相同颜色 / 灰度的点组成的曲线,代表物体的边界。
- 二值化:将灰度图转换为黑白二值图,是轮廓检测的前置步骤,只有黑白对比才能清晰识别边界。
- 轮廓近似:通过减少轮廓点的数量,用更少的点拟合出接近原始轮廓的形状,核心算法:Douglas-Peucker 算法。
二、基础项目实战 1:手机轮廓基础检测
2.1 核心目标
实现手机图像的灰度转换、二值化,并提取所有轮廓,完成基础轮廓绘制。

2.2 完整代码与解析
python
import cv2
# 1. 读取图像
phone = cv2.imread('phone.png')
# 2. 转换为灰度图
phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)
cv2.imshow('phone_gray', phone_gray)
# 3. 二值化处理
ret, phone_binary = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)
cv2.imshow('phone_binary', phone_binary)
# 4. 查找轮廓
# RETR_TREE:提取所有轮廓并建立层级关系;CHAIN_APPROX_NONE:保存所有轮廓点
contours = cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2]
print(f"检测到的轮廓数量:{len(contours)}")
# 5. 绘制轮廓
image_copy = phone.copy()
cv2.drawContours(image_copy, contours, -1, (0, 255, 0), 2)
cv2.imshow('Contours', image_copy)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.cvtColor:将 BGR 格式的彩色图转为灰度图,减少色彩维度对轮廓检测的干扰;
cv2.threshold:二值化是轮廓检测的关键,阈值 120 需根据图像实际亮度调整;
cv2.findContours:
