Я следую этому руководству, чтобы реализовать отслеживание объектов для моего проекта - https://www.pyimagesearch.com/2018/07/23/simple-object-tracking-with-opencv/
Метод состоит в том, чтобы найти центроиды обнаруженных объектов в начальном кадре, а затем рассчитать кратчайшее расстояние другим центроидам обнаруженных объектов, которые появляются на следующем кадре. Предполагается, что ближайший центроид был бы тем же объектом.
В учебнике -
from scipy.spatial import distance as dist
...
D = dist.cdist(np.array(objectCentroids), newCentroids)
используется для вычисления расстояния (евклидово расстояние). К сожалению, я не могу использовать модуль scipy, так как пытаюсь развернуть его на AWS Lambda (ограничение размера). В этом случае рекомендуется использовать это - https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html
D = np.linalg.norm(objectCentroids – newCentroids)
Проблема заключается в том, что, в отличие от dist.cdist
, где он вычисляет все и любую матрицу, np.linalg.norm
выводит только 1 значение, которое рассчитывается после вычитания newCentroids из матрицы objectCentroids. Я собираюсь l oop более чем в n раз (как бы ни была велика матрица) и добавляю к другой матрице, чтобы получить нужный мне результат. Однако я не был уверен, правильно ли я понимаю эту концепцию или нет, поэтому я хотел обратиться за помощью. Если кто-нибудь знает лучший способ, я был бы признателен за любой указатель.
ОБНОВЛЕНИЕ
На основании полученных отзывов / ответов я немного обновил код и хорошо ... кажется, что работает -
n = arrayObjectCentroids.shape[0]
m = inputCentroids.shape[0]
T = []
for i in range(0,n):
for z in range(0,m):
Tv = np.linalg.norm(arrayObjectCentroids[i] - inputCentroids[z])
# print(f'Tv is \n {Tv}')
T = np.append(T, Tv)
# print(f'T is \n {T}')
print(f'new T is \n {T}')
D = np.reshape(T, (n, m))
print(f'D is \n {D}')
В этом случае, если есть один объект и немного двигается -
newCentroids равен [[224 86]]
, и форма его is (1, 2) ... objectCentroids равен [[224 86]]
, а форма objectCentroids равна (1, 2)
D равно [[0.]]
Если у меня 3 объекта, -
новые центроиды имеют
[[228 79]
[ 45 127]
[103 123]]
форма вводаCentroids равна (3, 2)
objectCentroids равна
[[228 79]
[ 45 127]
[103 123]]
форма объектаCentroids равна (3, 2 )
D - это
[[ 0. 189.19038031 132.51792332]
[189.19038031 0. 58.13776741]
[132.51792332 58.13776741 0. ]]
Здорово, что это работает, но я чувствую, что это может быть не лучшим решением, и если у вас есть указатель, я был бы признателен! Спасибо!