res = cv2.matchTemplate(img_gray, tmpl, cv2.TM_CCOEFF)
count = np.sum(res > 230000)
y, x = np.unravel_index((-res).argsort(None), res.shape)
for row, col in zip(y[:count], x[:count]):
print(res[row, col], (row, col))
Пояснения к каждой строке:
count = np.sum(res > 230000)
возвращает общее количество значений, для которых вы хотите выполнить итерацию.
y, x = np.unravel_index((-res).argsort(None), res.shape)
Здесь argsort(None)
вернет линейные индексы в массив, который его сортирует. Нам нужны индексы (строка, столбец), а не линейные, поэтому мы используем np.unravel_index()
, чтобы получить 2d индексы. Использование отрицательного результата для сортировки от максимального к минимальному, как вы делали в ОП.
Тогда, наконец, мы можем перебрать точки:
for row, col in zip(y[:count], x[:count]):
print(res[row, col], (row, col))
Печать просто показывает, что мы действительно получаем самые высокие значения, и показываем индекс (строка, столбец) для этих соответствующих значений.
Пример:
>>> import cv2
>>> import numpy as np
>>> img = np.uint8(255*np.random.rand(100, 100))
>>> tmp = np.uint8(255*np.random.rand(10, 10))
>>> res = cv2.matchTemplate(img, tmp, cv2.TM_CCOEFF)
>>> count = np.sum(res > 100000)
>>> y, x = np.unravel_index((-res).argsort(None), res.shape)
>>> for row, col in zip(y[:count], x[:count]):
>>> print(res[row, col], (row, col))
206337.11 (19, 12)
177079.31 (76, 9)
173258.67 (63, 15)
...
100202.44 (56, 1)
100098.41 (0, 48)
100089.09 (68, 47)
Обратите внимание, что эти окончательные значения имеют порядок (строка, столбец), т. Е. Противоположны порядку точек (x, y), поэтому при необходимости меняйте местами.