OpenCV 入门教程:轮廓特征和轮廓匹配
- 导语
- 一、轮廓特征
- 二、轮廓匹配
- 三、示例应用
- 3.1 目标识别
- 3.2 形状分析
- 总结
导语
轮廓特征和轮廓匹配是图像处理中用于描述和比较轮廓的技术。通过提取轮廓的形状、面积、周长等特征,并进行比较和匹配,我们可以实现目标识别、形状分析等应用。在本文中,我们将以轮廓特征和轮廓匹配为中心,为你介绍使用 OpenCV 进行轮廓处理的基本步骤和实例。
😃😄 ❤️ ❤️ ❤️ ❤️ ❤️
一、轮廓特征
轮廓特征是指从轮廓中提取的描述性信息,用于对轮廓进行定量分析。以下是一些常见的轮廓特征:
1 面积( Area ):表示轮廓包围的区域的面积大小。
2 周长( Perimeter ):表示轮廓的边界长度。
3 边界框( Bounding Box ):表示能够完全包围轮廓的矩形框。
4 最小外接矩形( Minimum Enclosing Rectangle ):表示能够完全包围轮廓的最小矩形框。
5 最小外接圆( Minimum Enclosing Circle ):表示能够完全包围轮廓的最小圆。
6 中心点( Centroid ):表示轮廓的重心位置。
二、轮廓匹配
轮廓匹配是比较两个轮廓之间的相似度或差异度的技术。通过计算轮廓的形状、面积、周长等特征的差异,并进行比较,我们可以判断轮廓之间的相似性或不相似性。以下是一个使用轮廓匹配的示例代码:
import cv2
# 读取参考轮廓图像
reference_contour = cv2.imread('reference_contour.jpg', cv2.IMREAD_GRAYSCALE)
# 读取目标轮廓图像
target_contour = cv2.imread('target_contour.jpg', cv2.IMREAD_GRAYSCALE)
# 进行边缘检测
_, reference_edges = cv2.threshold(reference_contour, 127, 255, cv2.THRESH_BINARY)
_, target_edges = cv2.threshold(target_contour, 127, 255, cv2.THRESH_BINARY)
# 寻找轮廓
reference_contours, _ = cv2.findContours(reference_edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
target_contours, _ = cv2.findContours(target_edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算轮廓匹配
match = cv2.matchShapes(reference_contours[0], target_contours[0], cv2.CONTOURS_MATCH_I1)
在上述示例中,我们首先读取参考轮廓图像和目标轮廓图像,并通过边缘检测和轮廓寻找获取轮廓。然后,使用 matchShapes
函数计算轮廓之间的相似度。 CONTOURS_MATCH_I1
参数表示使用 I1 方法进行轮廓匹配。
三、示例应用
现在,我们来看一些常见的示例应用,演示轮廓特征和轮廓匹配的操作:
3.1 目标识别
使用轮廓特征和轮廓匹配可以实现目标识别,通过比较轮廓特征的相似度,判断是否存在目标对象。以下是一个示例代码:
import cv2
# 读取参考轮廓图像
reference_contour = cv2.imread('reference_contour.jpg', cv2.IMREAD_GRAYSCALE)
# 读取目标图像
target_image = cv2.imread('target_image.jpg')
# 进行边缘检测
_, reference_edges = cv2.threshold(reference_contour, 127, 255, cv2.THRESH_BINARY)
_, target_edges = cv2.threshold(target_image, 127, 255, cv2.THRESH_BINARY)
# 寻找轮廓
reference_contours, _ = cv2.findContours(reference_edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
target_contours, _ = cv2.findContours(target_edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算轮廓匹配
match = cv2.matchShapes(reference_contours[0], target_contours[0], cv2.CONTOURS_MATCH_I1)
# 判断目标是否存在
if match < 0.1:
print("目标存在!")
else:
print("目标不存在!")
这个示例将加载参考轮廓图像和目标图像,并通过边缘检测和轮廓匹配判断目标是否存在。
3.2 形状分析
使用轮廓特征可以进行形状分析,比如判断轮廓的形状类别或测量形状的尺寸。以下是一个示例代码:
import cv2
# 读取轮廓图像
contour_image = cv2.imread('contour_image.jpg', cv2.IMREAD_GRAYSCALE)
# 进行边缘检测
_, edges = cv2.threshold(contour_image, 127, 255, cv2.THRESH_BINARY)
# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算轮廓特征
for contour in contours:
area = cv2.contourArea(contour) # 计算轮廓面积
perimeter = cv2.arcLength(contour, True) # 计算轮廓周长
bounding_rect = cv2.boundingRect(contour) # 计算轮廓的边界矩形
min_enclosing_circle = cv2.minEnclosingCircle(contour) # 计算包围轮廓的最小圆
centroid = (int(min_enclosing_circle[0][0]), int(min_enclosing_circle[0][1])) # 计算轮廓的质心坐标
# 在图像上绘制轮廓特征
cv2.drawContours(contour_image, [contour], -1, (0, 255, 0), 2) # 绘制轮廓线
cv2.rectangle(contour_image, bounding_rect, (0, 0, 255), 2) # 绘制边界矩形
cv2.circle(contour_image, centroid, 5, (255, 0, 0), -1) # 绘制质心圆
# 在图像上显示轮廓特征信息
cv2.putText(contour_image, f"Area: {area}", (bounding_rect[0], bounding_rect[1] - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2) # 显示面积信息
cv2.putText(contour_image, f"Perimeter: {perimeter}", (bounding_rect[0], bounding_rect[1] + bounding_rect[3] + 20),
cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 255), 2) # 显示周长信息
# 显示带有轮廓特征的图像
cv2.imshow("Contours", contour_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
这个示例将加载轮廓图像,并通过边缘检测和轮廓特征计算轮廓的面积、周长、边界框、最小外接圆等,并在图像上绘制和显示轮廓特征。
总结
通过本文的介绍,你已经了解了使用 OpenCV 进行轮廓特征提取和轮廓匹配的基本步骤。你学会了使用 findContours
函数寻找轮廓,并通过计算轮廓的形状、面积、周长等特征进行轮廓匹配和形状分析。
轮廓特征和轮廓匹配是图像处理中常用的技术,可以应用于目标识别、形状分析等多个领域。通过提取轮廓特征并比较轮廓之间的相似度,我们可以实现对图像中目标区域的定量分析和比较。
[ 专栏推荐 ]
😃 《视觉探索:OpenCV 基础入门教程》😄
❤️【简介】:Opencv 入门课程适合初学者,旨在介绍 Opencv 库的基础知识和核心功能。课程包括图像读取、显示、保存,图像处理和增强(如滤波、边缘检测、图像变换),特征提取和匹配,目标检测和跟踪等内容。学员将通过学习基本操作和编程技巧,掌握 Opencv 在图像处理和计算机视觉任务中的应用。