contribute上次修改:2026-09-29

3.4 轮廓几何特征

总目录:1.1 OpenCV介绍与学习路线 | 第三章:边缘、轮廓与几何 | 编号:3.4

← 上一节:3.3 轮廓层级 | 下一节:3.5 多边形逼近与形状识别 →


3.4 轮廓几何特征

拿到轮廓点以后,我们终于可以问一些具体问题:它有多大?多长?中心在哪?像不像圆?这些数字叫做几何特征。

一、面积 contourArea

area = cv2.contourArea(contour)

单位通常可理解为像素平方。它计算轮廓围成的几何面积,不等于简单数出边界点个数。

过滤小噪点:

if area < 500:
    continue

同一个物体离相机更远、分辨率更低,面积都会变小,因此固定面积阈值不具备尺度不变性。

二、周长 arcLength

perimeter = cv2.arcLength(contour, closed=True)
  • closed=True:按闭合曲线计算;
  • False:按开放曲线计算。

周长常用于 多边形逼近 和圆度计算。

三、矩与质心 moments

moments = cv2.moments(contour)

if moments["m00"] != 0:
    cx = moments["m10"] / moments["m00"]
    cy = moments["m01"] / moments["m00"]
else:
    cx = cy = None
  • m00:零阶矩,对普通轮廓与轮廓面积对应;
  • m10、m01:一阶矩;
  • 二者分别除以 m00 得到面积质心。

m00 不是“把轮廓内部所有像素简单数一遍”的通俗等号;对轮廓输入,它来自多边形矩的计算。日常可以把结果理解成轮廓面积。

质心、边界框中心和对角线交点

中心 计算 特点
质心 moments 反映形状面积分布
轴对齐框中心 (x+w/2, y+h/2) 快,但受旋转和空白影响
旋转框中心 minAreaRect 返回 反映最小外接矩形中心
四边形对角线交点 两条对角线求交 适合透视四边形几何中心概念

它们回答的问题不同,不存在永远最“准”的一个。

四、外接矩形与外接圆

轴对齐矩形:

x, y, w, h = cv2.boundingRect(contour)

最小外接圆:

(cx, cy), radius = cv2.minEnclosingCircle(contour)
center = (round(cx), round(cy))
cv2.circle(result, center, round(radius), (0, 255, 0), 2)

旋转外接矩形放在 3.6 外接矩形与透视变换 细讲。

五、圆度和长宽比

圆度 circularity

if perimeter > 0:
    circularity = 4 * np.pi * area / (perimeter ** 2)

理想连续圆的圆度为 1。像素化、噪声和轮廓逼近会让结果偏离;小轮廓尤其不稳定。

长宽比 aspect ratio

x, y, w, h = cv2.boundingRect(contour)
aspect_ratio = w / h if h else 0

接近 1 只能说明轴对齐外接框接近正方形,不能单独证明目标是正方形:圆的外接框也接近 1。判断矩形还应结合角点数、凸性和填充程度。

六、特征要组合使用

def contour_features(contour):
    area = cv2.contourArea(contour)
    perimeter = cv2.arcLength(contour, True)
    x, y, w, h = cv2.boundingRect(contour)
    moments = cv2.moments(contour)

    center = None
    if moments["m00"] != 0:
        center = (
            moments["m10"] / moments["m00"],
            moments["m01"] / moments["m00"],
        )

    circularity = 0.0
    if perimeter > 0:
        circularity = 4 * np.pi * area / (perimeter ** 2)

    return {
        "area": area,
        "perimeter": perimeter,
        "bbox": (x, y, w, h),
        "center": center,
        "circularity": circularity,
    }

推荐筛选顺序:

面积粗筛 → 位置/层级 → 角点或长宽比 → 圆度/凸性 → 业务规则

先用便宜特征排除大部分候选,再计算复杂特征,代码更快也更清楚。

七、参考


← 上一节:3.3 轮廓层级 | 下一节:3.5 多边形逼近与形状识别 →

留言区

不收集任何个人信息;昵称只绑定浏览器里的随机 Cookie。