Как извлечь значение X или кортежа из openCV - findContours, где Y = 39 - PullRequest
1 голос
/ 05 мая 2019

Я запустил 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 ]

1 голос
/ 05 мая 2019

Контурные массивы OpenCV могут быть сложными для работы.Я обычно делаю это перед тем, как работать с ними:

contour = np.array([list(pt[0]) for ctr in contours for pt in ctr])

Затем вы можете получить свой список очков:

pts = contour[np.where(contour[:,1] == 49)]
0 голосов
/ 05 мая 2019

Вы можете использовать понимание списка для фильтрации элементов в контейнере.

В вашем примере структура данных немного запутана:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...