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。