You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用cv2.contourArea计算轮廓面积结果不符的问题求助

问题分析与解决

你的代码存在三个核心问题,直接导致计算结果与预期不符:

1. 图像尺寸参数错误

创建图像时,宽度误写为5122,正确值应为512:

image = np.zeros((512, 512, 3), np.uint8)

这个错误会生成异常宽的图像,虽不影响本次图形位置,但可能引发后续其他问题,建议修正。

2. 图形绘制为空心而非实心

调用cv2.rectangle和cv2.circle时,最后一个参数thickness=2表示绘制空心图形:

  • 空心正方形会被findContours提取出外轮廓和内轮廓两个独立轮廓,对应你输出中的contour 2和contour 3;
  • 空心圆形同理,contour 0和contour 1是它的内外轮廓。

而你预期的是实心图形的面积,需要将thickness设为-1,绘制实心图形:

cv2.rectangle(image, (100,100), (200,200), (0,255,0), -1 )
cv2.circle(image, (256, 256), 10, (0, 255, 0), -1)

3. 轮廓面积的计算逻辑误解

cv2.contourArea()计算的是轮廓包围的区域面积:

  • 空心正方形的外轮廓,其包围区域是整个外框范围(包含空心部分),内轮廓则是内框范围,两者都不是你要的实心面积;
  • 修正为实心图形后,轮廓仅包含图形的外边界,计算结果会完全符合预期。

修正后的完整代码

import cv2
import numpy as np

# 修正图像尺寸
image = np.zeros((512, 512, 3), np.uint8)
# 绘制实心图形
cv2.rectangle(image, (100,100), (200,200), (0,255,0), -1 )
cv2.circle(image, (256, 256), 10, (0, 255, 0), -1)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
contours, hierarchy = cv2.findContours(image_gray, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
superficie = [cv2.contourArea(cnt) for cnt in contours]
perimeter = [cv2.arcLength(cnt, True) for cnt in contours]

for i in range(0, len(superficie)):
    x, y, w, h = cv2.boundingRect(contours[i])
    print(f'contour {i} area: {superficie[i] } bounding area {w*h}  perimeter: {round(perimeter[i],2)}')

修正后的预期输出

contour 0 area: 10000.0 bounding area 10000  perimeter: 400.0
contour 1 area: 314.0 bounding area 441  perimeter: 62.83

(注:圆形的bounding矩形范围是从246到266,宽高均为21,21×21=441,符合预期)

内容的提问来源于stack exchange,提问作者miguel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 15:44:57