前言:
主要是对 np数组进行分析
说明
python
#轮廓的数据格式
contour = np.array([[[x1, y1]], [[x2, y2]], ..., [[x80, y80]]])
#例子:
o = binary #二值化图像 binary
contours, hierarchy = cv.findContours(o ,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
print(f"contours={contours}")
"""
contours=(array([[[209, 308]],
[[209, 313]],
[[208, 314]],
[[208, 315]],
[[207, 316]],
....
[[271, 314]],
[[270, 313]],
[[270, 308]]], dtype=int32),)
"""
print(len(contours)) # 1
print(contours[0].shape) #(80, 1, 2)
假设 contour
的形状是 (80, 1, 2)
,这表示该轮廓由 80 个点组成,每个点的坐标用两个数值表示(即 x 和 y 坐标)。
contour
的结构
contour
是一个三维数组:
-
第一维是点的数量(这里是 80)。
-
第二维是一个固定长度为 1 的维度,这是 OpenCV 中轮廓表示的约定格式。
-
第三维是坐标值,包含两个元素:x 坐标和 y 坐标。
contour[:, 0, 0]
的含义
[:, 0, 0]
:表示从contour
中提取所有点的 x 坐标。
具体来说:
-
:
表示选取所有行(所有点)。 -
0
表示选取第二维的第 0 个元素(因为第二维长度为 1)。 -
0
表示选取第三维的第一个元素(即 x 坐标)。
因此,contour[:, 0, 0]
提取的是所有点的 x 坐标,形成一个一维数组。
同理 contour[:, 0, 1] 表示提取所有点的y坐标
,形成一个一维数组。
例子
python
contour = np.array([ [[10, 20]], [[30, 40]], [[50, 60]]])
print(contour.shape) #(3, 1, 2)
print(contour[:, 0, 0]) # 结果是 [10, 30, 50]
print(contour[:, 0, 1]) # 结果是 [20, 40, 60]
"""
注意:
contour[:, 0, 0] 中
第一个元素表示所有 点 ,3个点
第二个元素 0 表示选取第二维的第 0 个元素(因为第二维长度为 1),
相当于上面第二个方括号,
第三个元素 0 表示选取第三维的第一个元素(即 x 坐标),
即 第三个方括号的 内部两个元素中的第一个
"""
参考资料
kimi