使用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
相关产品推荐
相关产品推荐

