Я использую Opencv с Python, я использую фильтр Калмана для прямоугольника, который я использовал, используя вычитание фона и MOSSE, тогда я собираюсь предсказать следующее местоположение с другим прямоугольником в другом цвет. Результат прогноза слишком сильно смещен.
![strawberry walking](https://i.imgur.com/46i4xCZ.png)
Я отредактировал разные результаты, основная проблема в том, что я не уверен в реализации kalman в Opencv, так как документация не велика, трудно понять, что она возвращает.
Это мой метод Калмана (я смотрел на примеры и понимаю основы, но я полагал, что это должно сработать, если честно).
kf = cv2.KalmanFilter(4, 2)
kf.measurementMatrix = np.array([[1, 0, 0, 0], [0, 1, 0, 0]], np.float32)
kf.transitionMatrix = np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32)
def Estimate(self, coordX, coordY):
measured = np.array([[np.float32(coordX)], [np.float32(coordY)]])
self.kf.correct(measured)
predicted = self.kf.predict()
return predicted
Тогда в каждом найденном ящике я запускаю этот
kalmanPredict = Kalman().Estimate(newbox[0],newbox[1])
kalmanPredict[0] = kalmanPredict[0] + newbox[0]
kalmanPredict[1] = kalmanPredict[1] + newbox[1]
p = np.asarray(self.centralize((p1,p2), (kalmanPredict[0],kalmanPredict[1])))
p = np.int0(p)
kpt1 = p[0],p[1]
kpt2 = p[2],p[3]
cv2.rectangle(frame, kpt1, kpt2, (255,0,0),2)
централизация - это метод, который я тестировал онлайн, который просто центрирует точки.
def centralize(self, box, c):
pt1, pt2 = box
xA, yA = pt1
xB, yB = pt2
cx, cy = c
w = xB - xA
h = yB - yA
halfW = int(w/2)
halfH = int(h/2)
xA = cx - halfW
yA = cy - halfH
xB = xA + w
yB = yA + h
return xA, yA, xB, yB
он должен учитывать положение / скорость - но просто не уверен в этих документах и ресурсах онлайн. Любая помощь будет высоко ценится, спасибо.