Использование фильтра Калмана openCV редко документируется с помощью нескольких, если таковые имеются, рабочих примеров - и тех, что в C ++.Я портировал предположительно работающий простой пример C ++ ( Предсказание фильтра Opencv kalman без нового наблюдения ).Мой порт работает, но не работает правильно.
Что я делаю неправильно?
Googling предоставил несколько рабочих примеров C ++ и некоторые нерабочие, более старые примеры Python.Документация openCV ссылается на C ++ «Пример вызовов c для фильтра Калмана OpenCV», т. Е. Не очень полезный.
measurement = np.zeros((2,1),dtype=np.float32)
state = np.zeros((4,1),dtype=np.float32) # (x, y, Vx, Vy)
kalman = cv2.KalmanFilter(4,2,0)
def initKalman(x,y): # init to 0,0
measurement[0][0] = x
measurement[1][0] = y
kalman.statePre = np.zeros((4,1),dtype=np.float32)
kalman.statePre[0,0] = x
kalman.statePre[1,0] = y
kalman.statePost = np.zeros((4,1),dtype=np.float32)
kalman.statePost[0,0] = x
kalman.statePost[1,0] = y
cv2.setIdentity(kalman.measurementMatrix)
cv2.setIdentity(kalman.processNoiseCov, .01)
cv2.setIdentity(kalman.measurementNoiseCov, .1)
cv2.setIdentity(kalman.errorCovPost, .1)
kalman.transitionMatrix = np.array([[1,0,1,0],
[0,1,0,1],
[0,0,1,0],
[0,0,0,1]],np.float32)
def kalmanPredict():
prediction = kalman.predict()
predictPr = [prediction[0,0],prediction[1,0]]
return predictPr
def kalmanCorrect(x,y):
measurement[0,0] = x
measurement[1,0] = y
estimated = kalman.correct(measurement)
return [estimated[0,0],estimated[1,0]]
def runK():
initKalman(0,0)
p = kalmanPredict(); # first time - should be the initial x,y, i.e., 0,0
print("first",p)
s = kalmanCorrect(10, 10);
print("C",s) # should be (per example) 5,5 -- but I get 0,0
p = kalmanPredict()
print("P",p) # should be (per example) 5,5 -- but I get 0,0
s = kalmanCorrect(20, 20);
print("C",s) # should be (per example) 10,10 -- but I get 0,0
p = kalmanPredict()
print("P",p) # should be (per example) 10,10 -- but I get 0,0
s = kalmanCorrect(30, 30); # -- but I get 0,0
print("C",s)
p = kalmanPredict() # -- but I get 0,0
print("P",p)
runK()
---- with the output ----
first [0.0, 0.0]
C [0.0, 0.0]
P [0.0, 0.0]
C [0.0, 0.0]
P [0.0, 0.0]
C [0.0, 0.0]
P [0.0, 0.0]
Я ожидал результатов из примера C ++.Вместо этого я получил все нули, т.е. не очень хорошие результаты.
Спасибо !!!!