我在图像上运行了cv2.findContours
。
结果是3个轮廓。这是findContours的输出-
print (cnt)
[array([[[149, 0]],
[[149, 1]],
[[148, 2]],
[[148, 8]],
[[149, 9]],
[[149, 11]],
[[148, 12]],
[[148, 39]],
[[213, 39]],
[[213, 30]],
[[212, 29]],
[[213, 28]],
[[213, 23]],
[[212, 22]],
[[212, 3]],
[[211, 2]],
[[211, 0]],
[[161, 0]],
[[160, 1]],
[[159, 0]]], dtype=int32),
array([[[148, 5]],
[[149, 4]],
[[150, 5]],
[[150, 8]],
[[149, 9]],
[[148, 8]]], dtype=int32),
array([[[ 0, 0]],
[[ 0, 39]]], dtype=int32)]
我想从第一个轮廓[0]获得元组,其中y=39
在这种情况下,我想得到:
[[148, 39]],
[[213, 39]]
答案 0 :(得分:1)
使用OpenCV轮廓数组可能很棘手。我通常在与他们合作之前先这样做:
contour = np.array([list(pt[0]) for ctr in contours for pt in ctr])
然后您可以得到要点列表:
pts = contour[np.where(contour[:,1] == 49)]
答案 1 :(得分:0)
您可以使用列表推导来过滤容器中的元素。
在您的示例中,数据结构有点复杂:
selection = [i for i in cnt[0] if i[0][1] == 39]
我们在cnt[0]
上进行迭代,因为它描述了第一个轮廓。在这种情况下,我们需要一个额外的索引操作(由于额外的数组换行,所以使用i[0][1]
而不是i[1]
来达到y值。
我们也可以使用此操作来一次性简化输出:
selection = [i[0] for i in cnt[0] if i[0][1] == 39]