当前位置: 首页 > news >正文

(纯新手教学)计算机视觉(opencv)实战十——轮廓特征(轮廓面积、 轮廓周长、外接圆与外接矩形)


轮廓特征详解

在图像处理和计算机视觉中,轮廓(Contour) 是物体边界的一种表现形式。通过提取图像中的轮廓,我们可以获取目标区域的形状、面积、周长、外接几何体等重要特征,为后续的目标识别、分类和检测奠定基础。

OpenCV 提供了一系列函数来计算和操作轮廓,本文将结合代码示例对常见的轮廓特征进行说明。


原图:

1. 轮廓面积 cv2.contourArea()

#--------轮廓特征--------
import  cv2phone = cv2.imread('phone.png')#读取原图
phone_gray = cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)#灰度图的处理
ret, phone_binary = cv2.threshold(phone_gray,120,255, cv2.THRESH_BINARY)#阈值处理为二值
_,contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# contours = cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2]  # 通用# cv2.contourArea(contour[, oriented]) -> retval     轮廓面积
# contour:顶点构成的二维向量组(如轮廓列表contours中的一个轮廓)
# oriented,定向区域标志,默认值为 False,返回面积的绝对值,Ture 时则根据轮廓方向返回带符号的数值
area_0 = cv2.contourArea(contours[0])
print(area_0)
area_1 = cv2.contourArea(contours[1])
print(area_1)
  • cv2.contourArea() 用于计算轮廓所包围的区域面积。

  • 参数说明:

    • contour:单个轮廓(点集)。

    • oriented:布尔值,默认为 False,返回面积绝对值;若为 True,则返回带符号的值(顺时针或逆时针)。

在实际应用中,面积可用于 过滤小轮廓(噪声),或用于 目标筛选(如筛选面积最大的轮廓)。


2. 轮廓周长 cv2.arcLength()

# arclength(InputArray curve, bool closed)            轮廓周长
# curve,输入的二维点集(轮廓顶点),可以是 vector 或 Mat 类型。
# closed,用于指示曲线是否封闭。
length = cv2.arcLength(contours[0],closed=True)
print(length)
  • cv2.arcLength() 用于计算轮廓的 周长

  • 参数:

    • curve:输入轮廓点集。

    • closed:是否闭合,通常为 True

周长可用于目标形状分析,例如判断目标是否接近圆形、多边形等。


3. 按面积筛选轮廓

# 根据面积显示特定轮廓
a_list=[]
for i in contours:if cv2.contourArea(i)>10000:a_list.append(i)
image_copy = phone.copy()
image_copy = cv2.drawContours(image=image_copy, contours=a_list, contourIdx=-1,color=(0,255,0),thickness=3)
cv2.imshow('Contours_show_10000', image_copy)
cv2.waitKey(0)
  • 这里通过遍历所有 contours,利用 cv2.contourArea(i)>10000 进行筛选,仅保留面积大于 10000 的轮廓。

  • 通过 cv2.drawContours() 绘制符合条件的轮廓。

这种方法常用于 去除小噪声轮廓,只显示大目标。


4. 轮廓排序与最大轮廓提取

# '''轮廓定位方法 根据轮廓面积进行排序'''
sortcnt = sorted(contours, key=cv2.contourArea, reverse=True)[0]  # 选取最大面积的轮廓
image_contours = cv2.drawContours(phone.copy(), contours=[sortcnt], contourIdx=-1, color=(0,255,255),thickness=3)#绘制轮廓
cv2.imshow('image_contours',image_contours)
cv2.waitKey(0)
  • 使用 Python 内置 sorted() 函数,按照 cv2.contourArea 计算的面积进行排序,reverse=True 表示从大到小排序。

  • 这里选取面积最大的轮廓 sortcnt,并绘制在图像上。

👉 常见应用:提取图像中最主要的目标区域。


5. 外接圆与外接矩形

### 外接圆、外接矩形...
'''外接圆、外接矩形'''
cnt = contours[6]
(x,y),r = cv2.minEnclosingCircle(cnt)#计算轮廓的外接圆
phone_circle = cv2.circle(phone, (int(x),int(y)),int(r), (0,255,0),  2)#绘制外接圆的方法
cv2.imshow('phone_circle',phone_circle)
cv2.waitKey(0)x,y,w,h = cv2.boundingRect(cnt)#计算轮廓的最小外接矩形
phone_rectangle = cv2.rectangle(phone, (x,y), (x+w,y+h), (0,255,0), 2)  # 在图像上绘制矩形
cv2.imshow('phone_rectangle',phone_rectangle)
cv2.waitKey(0)

外接圆 cv2.minEnclosingCircle()

  • 计算轮廓的最小外接圆。

  • 返回值:圆心坐标 (x,y) 和半径 r

  • 适用于检测近似圆形目标。

外接矩形 cv2.boundingRect()

  • 计算轮廓的最小外接矩形(水平的,不旋转)。

  • 返回 (x,y,w,h),分别为矩形左上角坐标及宽高。

  • 常用于目标定位与裁剪。


总结

本文结合代码演示了 轮廓特征的核心方法

  1. 面积cv2.contourArea()

  2. 周长cv2.arcLength()

  3. 按面积筛选轮廓

  4. 排序提取最大轮廓

  5. 外接圆、外接矩形

这些特征在 物体检测、目标识别、形状分析 等任务中非常常用。
通过这些几何特征,我们可以更好地理解和利用轮廓信息。


在计算机视觉和图像处理领域,轮廓特征(Contour Features)用于描述图像中目标物体的形状、大小和位置等几何属性。轮廓是通过检测物体的边界(像素边缘)形成的,它是表示图像物体的一种重要方式。以下是常见的 轮廓特征,以及它们的详细说明:


1. 轮廓面积(Contour Area)

cv2.contourArea(contour)

  • 功能:计算轮廓所包围区域的面积。

  • 使用场景

    • 用于 目标筛选,例如去除小噪声或小物体。

    • 计算对象的 尺寸,并用面积来分类。

示例:

area = cv2.contourArea(contour)
  • 返回值:轮廓的面积(float类型)。

  • 说明:面积可以帮助我们了解物体的大小,通常会用面积来进行阈值过滤,只保留大于某个面积的轮廓。


2. 轮廓周长(Contour Perimeter / Arc Length)

cv2.arcLength(contour, closed)

  • 功能:计算轮廓的周长或弧长。

  • 参数

    • contour:需要计算的轮廓。

    • closed:布尔值,是否闭合轮廓。

示例:

length = cv2.arcLength(contour, closed=True)
  • 返回值:轮廓的周长(float类型)。

  • 说明:周长可以描述物体的边界长度,对于形状的 复杂性分析 非常有用。


3. 外接矩形(Bounding Rectangle)

cv2.boundingRect(contour)

  • 功能:计算轮廓的最小外接矩形。

  • 使用场景

    • 目标定位,用于显示和裁剪。

    • 形状简化,通过矩形来描述目标,特别是当目标接近矩形时。

示例:

x, y, w, h = cv2.boundingRect(contour)
  • 返回值:矩形的 (x, y) 位置和 (w, h) 宽高。

  • 说明:外接矩形简单直观,广泛用于目标定位,尤其是在 目标检测 中。


4. 最小外接圆(Minimum Enclosing Circle)

cv2.minEnclosingCircle(contour)

  • 功能:计算轮廓的最小外接圆,即能完全包围轮廓的最小圆形。

  • 使用场景

    • 判断目标是否接近 圆形

    • 碰撞检测 中,如果目标是圆形的,可以使用外接圆来简化计算。

示例:

(x, y), r = cv2.minEnclosingCircle(contour)
  • 返回值:圆心 (x, y) 和半径 r

  • 说明:外接圆是目标的最小圆形框,它常用于检测 近似圆形的目标


5. 凸包(Convex Hull)

cv2.convexHull(contour)

  • 功能:计算轮廓的凸包,即包含轮廓的最小凸多边形。

  • 使用场景

    • 用于提取物体的 凸性。如果目标物体是凸形状,凸包几乎和物体本身一致。

    • 也可用于形状 简化,忽略内部凹陷。

示例:

hull = cv2.convexHull(contour)
  • 返回值:轮廓的 凸包,即包含所有轮廓点的最小凸多边形。

  • 说明:凸包可以用来处理 不规则的形状,去除内凹部分,描述物体的外轮廓。


6. 轮廓的方向(Contour Orientation)

cv2.isContourConvex(contour)

  • 功能:判断轮廓是否是 的。

  • 使用场景

    • 判断轮廓是否有内凹部分,从而判断物体的 凸凹性质

示例:

is_convex = cv2.isContourConvex(contour)
  • 返回值:布尔值,True 表示是凸的,False 表示有凹陷。

  • 说明:该方法有助于确定形状的基本性质,例如 凸多边形凹多边形 的区别。


7. 最小外接椭圆(Min Area Rectangle)

cv2.fitEllipse(contour)

  • 功能:拟合轮廓到最小外接椭圆。

  • 使用场景

    • 用于 椭圆形物体的检测,或 旋转矩形 的定位。

示例:

ellipse = cv2.fitEllipse(contour)
  • 返回值:椭圆的 中心点长短轴旋转角度

  • 说明:该特征可以帮助处理 非矩形目标,例如 椭圆形的目标


8. 轮廓近似(Contour Approximation)

cv2.approxPolyDP(contour, epsilon, closed)

  • 功能:通过近似多边形逼近轮廓,用于简化轮廓。

  • 使用场景

    • 对轮廓进行 简化,减少轮廓的点数,使其更适合后续处理。

示例:

approx = cv2.approxPolyDP(contour, epsilon=0.02*cv2.arcLength(contour, True), closed=True)
  • 返回值:简化后的 多边形点集

  • 说明:该方法可以用来减少 轮廓点的数量,使轮廓变得更加简洁,常用于 形状检测


9. 轮廓的质心(Centroid)

质心(也叫 重心)是指轮廓的“几何中心”,它可以用于表示物体的位置。

如何计算?

  1. 计算轮廓的 ,例如二阶矩

  2. 使用矩的公式计算 质心

M = cv2.moments(contour)
cx = int(M['m10'] / M['m00'])
cy = int(M['m01'] / M['m00'])
  • 返回值:质心的坐标 (cx, cy)

  • 说明:质心常用于 目标定位,特别是跟踪物体时。


总结

轮廓特征是图像分析中的一个重要部分,它们帮助我们获取目标物体的形状、大小、位置等几何信息。常见的轮廓特征包括 面积、周长、外接矩形、外接圆、凸包方向质心 等。在实际应用中,轮廓特征被广泛应用于 目标识别、目标定位、形状分析图像分割 等任务。通过提取这些特征,能够有效地理解和分析图像中的物体。

http://www.dtcms.com/a/358135.html

相关文章:

  • 在Kotlin中安全的管理资源
  • 突破视界的边界:16公里远距离无人机图传模块全面解析
  • 神经网络激活函数:从ReLU到前沿SwiGLU
  • 华为对“业务对象”是怎样定义与应用的?
  • Linux网络服务发现在VPS云服务器自动化配置的关键技术与实践
  • 运维底线:一场关于原则与妥协的思辨
  • 4-ATSAM3X8E-FLASH写入
  • var maxScore = Int.MinValue 详解
  • 简易TCP网络程序
  • Kafka 主题级配置从创建到优化
  • CSS学习与心得分享
  • 【lua】table基础操作
  • 欧司朗对Spider Farmer提起专利诉讼
  • Vue常用指令和生命周期
  • TimeDP Learning to Generate Multi-Domain Time Series with Domain Prompts论文阅读笔记
  • Kubernetes 部署与发布完全指南:从 Pod 到高级发布策略
  • 一款支持动态定义路径的JAVA内存马维权工具Agenst
  • ifconfig 和 ip addr show 输出详细解读
  • `basic_filebuf`、`basic_ifstream`、`basic_ofstream`和 `basic_fstream`。
  • 【高级机器学习】 4. 假设复杂度与泛化理论详解
  • 【超全汇总】MySQL服务启动命令手册(Linux+Windows+macOS)(上)
  • React前端开发_Day10
  • 针对 “TCP 连接建立阶段” 的攻击
  • PAT 1088 Rational Arithmetic
  • android adb调试 鸿蒙
  • 微信小程序长按识别图片二维码
  • mysql的内置函数
  • psql介绍(PostgreSQL命令行工具)(pgAdmin内置、DBeaver、Azure Data Studio)数据库命令行工具
  • 三数之和,leetCode热题100,C++实现
  • Ubuntu 中通过 SSH 克隆 Windows 上的 Git 仓库