如何从openCV中提取X或元组值-findContours其中Y = 39

时间:2019-05-05 16:48:09

标签: python python-3.x numpy opencv

我在图像上运行了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]]

2 个答案:

答案 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]